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 <dirk@hohndel.org>
This commit is contained in:
Dirk Hohndel 2015-03-10 10:22:34 -07:00
parent 44b55bd1a2
commit 1e3700c11f
4 changed files with 14 additions and 4 deletions

View file

@ -4,6 +4,7 @@
#include "divelist.h"
#include <QtConcurrentMap>
#include <QtConcurrentRun>
#include <QFuture>
#include <QDir>
#include <QCryptographicHash>
#include <mainwindow.h>
@ -53,6 +54,14 @@ SPixmap scaleImages(picturepointer picture)
return ret;
}
void DivePictureModel::updateDivePicturesWhenDone(QList<QFuture<void> > futures)
{
Q_FOREACH (QFuture<void> f, futures) {
f.waitForFinished();
}
updateDivePictures();
}
void DivePictureModel::updateDivePictures()
{
if (numberOfPictures != 0) {

View file

@ -4,6 +4,7 @@
#include <QAbstractTableModel>
#include <QListView>
#include <QThread>
#include <QFuture>
typedef QPair<QString, QByteArray> 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<QFuture<void> >);
void removePicture(const QString& fileUrl);
private:

View file

@ -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<QFuture<void> > 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

View file

@ -870,6 +870,4 @@ void learnImages(const QDir dir, int max_recursions, bool recursed)
}
QtConcurrent::blockingMap(files, hashFile);
if (!recursed)
DivePictureModel::instance()->updateDivePictures();
}