[Digikam-devel] extragear/graphics/digikam/utilities/cameragui

Gilles Caulier caulier.gilles at gmail.com
Wed Oct 14 22:09:09 BST 2009


Andi,

This loop query the database. I'm not sure if DB methods are thread
safe. Anyway, i don't think that moving this code in camera ctrl is
the right place. Writting another little QThread wrapper to run this
code will be better i think.

Gilles

2009/10/14 Andi Clemens <andi.clemens at gmx.net>:
> SVN commit 1035366 by aclemens:
>
> Do not refresh the icon view for every single emitted signal from the
> CameraController.
> This will not only lock the GUI, but also lead to enormous memory consumption.
> Why? Because files get reloaded as much as signals are emitted from the
> CameraController.
>
> If you open a folder with 200 subfolders, the iconview and its content gets
> reloaded 200 times.
>
> For my testfolder this meant that over 2 million images were loaded as
> thumbnails, and this is NOT very system friendly :)
>
> The CameraUI is much more responsive now, but still there are issues:
>
> - The do...while loop in cameraui.cpp:1179 will lock the UI while all the
>  images are processed. Problem: We can not set the CameraUI window to busy,
>  and therefore it looks like the download has already been completed.
>
> - Sometimes the thumbnail generation can not be canceled, but I have not
>  figured out why yet.
>
> Maybe it would be best to move the code from the do...while loop into the
> CameraController thread and emit signals?
>
> CCMAIL:digikam-devel at kde.org
>
>  M  +25 -1     cameraui.cpp
>  M  +2 -0      cameraui.h
>  M  +4 -0      cameraui_p.h
>
>
> --- trunk/extragear/graphics/digikam/utilities/cameragui/cameraui.cpp #1035365:1035366
> @@ -145,6 +145,15 @@
>
>     // -------------------------------------------------------------------
>
> +    d->refreshIconViewTimer = new QTimer(this);
> +    d->refreshIconViewTimer->setInterval(0);
> +    d->refreshIconViewTimer->setSingleShot(true);
> +
> +    connect(d->refreshIconViewTimer, SIGNAL(timeout()),
> +            this, SLOT(slotRefreshIconView()));
> +
> +    // -------------------------------------------------------------------
> +
>     setupUserArea();
>     setupStatusBar();
>     setupActions();
> @@ -1087,6 +1096,18 @@
>     if (fileList.empty())
>         return;
>
> +    d->filesToBeAdded << fileList;
> +    slotRefreshIconView();
> +}
> +
> +void CameraUI::slotRefreshIconView()
> +{
> +    if (d->busy)
> +    {
> +        d->refreshIconViewTimer->start();
> +        return;
> +    }
> +
>     AlbumSettings* settings = AlbumSettings::instance();
>     if (!settings) return;
>
> @@ -1117,7 +1138,7 @@
>         citem = static_cast<CameraIconItem*>(citem->nextItem());
>     }
>
> -    foreach(const GPItemInfo& item, fileList)
> +    foreach(const GPItemInfo& item, d->filesToBeAdded)
>     {
>         info.setFile(item.name);
>         if (!fileNames.contains(info.fileName().toLower()) &&
> @@ -1153,11 +1174,14 @@
>     QList<QVariant> itemsList;
>
>     it = lastPhotoFirst ? map.end() : map.begin();
> +
> +    // This can be slow and lock the GUI. Maybe we need to move this into the camera controller thread?
>     do
>     {
>         if (lastPhotoFirst) --it;
>
>         item = *it;
> +
>         // We query database to check if item have been already downloaded from camera.
>         switch(DownloadHistory::status(d->controller->cameraMD5ID(), item.name, item.size, item.mtime))
>         {
> --- trunk/extragear/graphics/digikam/utilities/cameragui/cameraui.h #1035365:1035366
> @@ -208,6 +208,8 @@
>
>     void slotSidebarTabTitleStyleChanged();
>
> +    void slotRefreshIconView();
> +
>  private:
>
>     CameraUIPriv* const d;
> --- trunk/extragear/graphics/digikam/utilities/cameragui/cameraui_p.h #1035365:1035366
> @@ -116,6 +116,7 @@
>         kdeJob                    = 0;
>         historyView               = 0;
>         lastPhotoFirstAction      = 0;
> +        refreshIconViewTimer      = 0;
>     }
>
>     bool                          deleteAfter;
> @@ -130,6 +131,7 @@
>     QStringList                   currentlyDeleting;
>     QStringList                   cameraFolderList;
>     QSet<QString>                 foldersToScan;
> +    GPItemInfoList                filesToBeAdded;
>
>     QCheckBox                    *autoRotateCheck;
>     QCheckBox                    *autoAlbumDateCheck;
> @@ -140,6 +142,8 @@
>     QLabel                       *formatLabel;
>     QLabel                       *folderDateLabel;
>
> +    QTimer                       *refreshIconViewTimer;
> +
>     KMenu                        *downloadMenu;
>     KMenu                        *deleteMenu;
>     KMenu                        *imageMenu;
> _______________________________________________
> Digikam-devel mailing list
> Digikam-devel at kde.org
> https://mail.kde.org/mailman/listinfo/digikam-devel
>



More information about the Digikam-devel mailing list