Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 306
Nemeth Attila Avatar asked Jan 05 '23 10:01

Nemeth Attila


1 Answers

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, SIGNAL(finished()), this, SLOT(doSomething()));
    // delete the watcher when finished too
     connect(watcher, SIGNAL(finished()), watcher, SLOT(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();
}
like image 104
alexisdm Avatar answered Jan 12 '23 07:01

alexisdm