微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

QThread isRunning 始终为真

如何解决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() 来检查它是否在我的函数完成后退出,但它永远不会从我调用的第一个函数返回,尽管这两个函数都成功地结束了

非常感谢您的帮助

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。