Can I search for files via QtConcurrent?
I need to find files on my HDD (recursively).
But it takes a long of time and GUI freezes.
I try to solve it via QtConcurrent:
- void MainWindow::on_buttonSearch_clicked()
- connect(&watcher, SIGNAL(finished()), this, SLOT(loadFinished()));
- future = QtConcurrent::run(&MainWindow::searchForFiles, lineEditInDir->text()); // in .h QFuture<QFileInfoList> future;
- QDir dir(startDir);
- QFileInfoList list;
- list += QFileInfo(startDir+"/"+file);
- list += searchForFiles(startDir+"/"+subdir);
- return list;
- void MainWindow::loadFinished()
- fileList = future.result();
All works fine, I think, but I can’t cancel it. future.cancel() didn’t work, because I use QtConcurrent::run().
And i don’t know how to put files search into QtConcurrent::mapped(), which can be canceled.
I think it would be useless to use QtConcurrent for this. QtConcurrent is suitable for problems that are are easy to parallelize. Searching your HDD will have I/O as the bottleneck, so using multiple threads to do that is not efficient. The threads will end up waiting for each other.
So, I would use either a QObject derived worker that you move to a vanilla QThread, or a QRunnable subclass in conjunction with QThreadPool. Because you seem to need cancel capabilities, I think the QThread route would be easiest.