线程完成后如何 运行 我的 Qt 函数?

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();    
    }
}

我有这个代码。我想在识别功能完成 运行ning 后 运行 DoSomething() 功能。可能吗?

您可以将 QFuture 对象传递给 QFutureWatcher 并将其 finished() 信号连接到函数或插槽 DoSomething()

例如:

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
{
    // ...
}   

或者您可以使用嵌套事件循环来保持 GUI 的响应速度,并将所有内容都放在同一个函数中:

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();
}

我喜欢这种通话布局。

auto watcher = new QFutureWatcher<int>(this);
connect(watcher, &QFutureWatcher<int>::finished,
    [watcher, this] ()
{
    watcher->deleteLater();
    auto res = watcher->result();
    // ...
});

watcher->setFuture(QtConcurrent::run(identify, param1, param2));