From 1e3700c11fc58801f78ac8fd94a672a7af2238b5 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Tue, 10 Mar 2015 10:22:34 -0700 Subject: [PATCH] Don't call UI functions from helper code This may seem much more complicated but actually is much cleaner. Add each thread we start to the list of future results and add a new UI function that updates the UI once all of the threads have finished. Signed-off-by: Dirk Hohndel --- qt-ui/divepicturewidget.cpp | 9 +++++++++ qt-ui/divepicturewidget.h | 2 ++ qt-ui/mainwindow.cpp | 5 +++-- qthelper.cpp | 2 -- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/qt-ui/divepicturewidget.cpp b/qt-ui/divepicturewidget.cpp index a0d209b6d..1baceeb7e 100644 --- a/qt-ui/divepicturewidget.cpp +++ b/qt-ui/divepicturewidget.cpp @@ -4,6 +4,7 @@ #include "divelist.h" #include #include +#include #include #include #include @@ -53,6 +54,14 @@ SPixmap scaleImages(picturepointer picture) return ret; } +void DivePictureModel::updateDivePicturesWhenDone(QList > futures) +{ + Q_FOREACH (QFuture f, futures) { + f.waitForFinished(); + } + updateDivePictures(); +} + void DivePictureModel::updateDivePictures() { if (numberOfPictures != 0) { diff --git a/qt-ui/divepicturewidget.h b/qt-ui/divepicturewidget.h index e8104a1db..506f85bf8 100644 --- a/qt-ui/divepicturewidget.h +++ b/qt-ui/divepicturewidget.h @@ -4,6 +4,7 @@ #include #include #include +#include typedef QPair SHashedFilename; @@ -25,6 +26,7 @@ public: virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; virtual int rowCount(const QModelIndex &parent = QModelIndex()) const; void updateDivePictures(); + void updateDivePicturesWhenDone(QList >); void removePicture(const QString& fileUrl); private: diff --git a/qt-ui/mainwindow.cpp b/qt-ui/mainwindow.cpp index e7235f9f8..f8335affb 100644 --- a/qt-ui/mainwindow.cpp +++ b/qt-ui/mainwindow.cpp @@ -327,14 +327,15 @@ void MainWindow::on_actionHash_images_triggered() dialog.setLabelText(QFileDialog::Accept, tr("Scan")); dialog.setLabelText(QFileDialog::Reject, tr("Cancel")); QStringList dirnames; + QList > futures; if (dialog.exec()) dirnames = dialog.selectedFiles(); if (dirnames.isEmpty()) return; foreach (QString dir, dirnames) { - QtConcurrent::run(learnImages, QDir(dir), 10, false); + futures << QtConcurrent::run(learnImages, QDir(dir), 10, false); } - + DivePictureModel::instance()->updateDivePicturesWhenDone(futures); } ProfileWidget2 *MainWindow::graphics() const diff --git a/qthelper.cpp b/qthelper.cpp index 14e67e089..189d47ed3 100644 --- a/qthelper.cpp +++ b/qthelper.cpp @@ -870,6 +870,4 @@ void learnImages(const QDir dir, int max_recursions, bool recursed) } QtConcurrent::blockingMap(files, hashFile); - if (!recursed) - DivePictureModel::instance()->updateDivePictures(); }