Nemeth Attila Nemeth Attila - 3 months ago 12
C++ Question

How can I run my Qt function after a thread has finished?

void MainWindow::on_pushButton_clicked()
{
QFuture<int> future = QtConcurrent::run(identify); //Thread1
if (future.isFinished())
{
//DoSomething();
}
}


I have this code. I want to run the
DoSomething()
function after the identify function finished running. Is it possible?

Answer

You can pass the QFuture object to a QFutureWatcher and connect its finished() signal to the function or slot DoSomething().

For example:

void MainWindow::on_pushButton_clicked()
{
    QFuture<int> future = QtConcurrent::run(identify); //Thread1
    QFutureWatcher<int> *watcher = new QFutureWatcher<int>(this);
    connect(watcher, &QFutureWatcher<int>::finished, this, &MainWindow::DoSomething);
    // delete the watcher when finished too
    connect(watcher, &QFutureWatcher<int>::finished, watcher, &QFutureWatcher<int>::deleteLater);
    watcher->setFuture(future);
}

void MainWindow::DoSomething() // slot or ordinary function
{
    // ...
}   

Or you could use a nested event loop to keep the GUI responsive and have everything inside the same function:

void MainWindow::on_pushButton_clicked()
{
    QFuture<int> future = QtConcurrent::run(identify);  //Thread1
    QFutureWatcher<int> watcher;
    QEventLoop loop;
    // QueuedConnection is necessary in case the signal finished is emitted before the loop starts (if the task is already finished when setFuture is called)
    connect(&watcher, SIGNAL(finished()), &loop, SLOT(quit()),  Qt::QueuedConnection); 
    watcher.setFuture(future);
    loop.exec();

    DoSomething();
}