我在 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()
检查它是否在我的函数完成后退出,但它永远不会从我调用的第一个返回,尽管这两个函数都成功结束
非常感谢您的帮助