0

我正在尝试使用QThread在另一个线程中调用函数而无需冻结 UI。我在windowslinux上都使用QT5.11.2

在 Windows 上一切正常,但 wait() 函数QThread无论如何都不会返回。

我在 Linux 上使用RHEL7

这是我正在做的事情:

void MainWidget::configure_click(double value)
{
    QThread *myThread = QThread::create([this, value]{ Configure(value); });
    dsoThread->setObjectName("My Configure Thread");
    QObject::connect(myThread, &QThread::finished, [](){ qDebug()<< "Configure Thread has finished";});  //  This is never printed

    myThread->start();
    myThread->wait();  //  Never returns from this
    myThread->quit();
    myThread->deleteLater();
}

我的Configure函数打印它的开始和结束,并且两行都在运行时打印

void MainWidget::Configure(double value)
{
    qDebug() << QThread::currentThread() << " started";
    
    //  Code to execute

    qDebug() << QThread::currentThread() << " finished";
}

我什至读到quit()强制线程停止,所以只是为了测试我尝试切换quit()wait()就像这样

    myThread->quit();
    myThread->wait();  //  Never returns from this either
    myThread->deleteLater();

我什至尝试循环isRunning()函数而不是wait()但我得到了相同的结果

    while(myThread->isRunning())  //  Same goes for !isFinished()
    {
        //  Do nothing
    }

似乎无论线程如何,它都不知道它已经完成。

我可以做些什么来解决这个问题或检查为什么会发生这种情况?

4

1 回答 1

0
  1. 你还没有start()编辑线程。
  2. myThread->wait();在 gui 线程中,线程等待线程终止,因此它阻塞了 gui 线程事件循环,因此您以这种方式失去了线程的所有好处,还不如Configure(value);不使用线程。

文档说:

通常不需要 wait() 和 sleep() 函数,因为 Qt 是一个事件驱动的框架。考虑监听finished() 信号,而不是wait()。考虑使用 QTimer,而不是 sleep() 函数。

于 2021-04-15T11:46:37.043 回答