首页 > 解决方案 > QThread isRunning 始终为真

问题描述

我在 linux 和 windows 上都使用 QT 5.11.2。我正在尝试优化我的 UI 以防止它在大型功能中冻结。我开始使用QThread并且能够在 Windows 上做我想做的事。但是,我尝试在 linux RHEL7 上测试相同的功能,但线程从未完成。

这是我尝试过的:

void MainWidget::Configure_BERT_DSO(bool isOptimization, double lineRate, int Scaling)
{
    QThread *bertThread = QThread::create([this, lineRate, Scaling]{ ConfigureBert(lineRate, Scaling); 

    QThread *dsoThread = QThread::create([this, lineRate]{ ConfigureDSO(lineRate); });

    bertThread->setObjectName("My Bert Thread");
    dsoThread->setObjectName("My DSO Thread");

    bertThread->start();
    dsoThread->start();

    while(bertThread->isRunning() || dsoThread->isRunning())  //  even tried isFinished()
    {
        qApp->processEvents();
    }

    bertThread->exit();
    dsoThread->exit();

    delete bertThread;
    delete dsoThread;
}

在 Windows 中,while循环会在一段时间后退出,两个线程都可以正常执行,没有问题。在 linux 上,为了确保两个函数都能正确执行,我qDebug()在每个函数的开头和结尾添加了它们,它们都在预期的时间到达。但问题是它isRunning永远不会再次成为真的,同样的情况也是如此isFinished,我的循环被卡住了。

线程:QThread(0x1d368b0, name = "My Bert Thread") 已启动。

线程:QThread(0x1d368e0, name = "My DSO Thread") 已启动。

线程:QThread(0x1d368b0, name = "My Bert Thread") 完成。

线程:QThread(0x1d368e0, name = "My DSO Thread") 完成。

它是依赖于平台的还是我可能缺少的东西?

编辑 我还尝试使用bertThread->wait()dsoThread->wait()检查它是否在我的函数完成后退出,但它永远不会从我调用的第一个返回,尽管这两个函数都成功结束

非常感谢您的帮助

标签: linuxqt5qthreadqt5.11

解决方案


推荐阅读