linux - 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()
检查它是否在我的函数完成后退出,但它永远不会从我调用的第一个返回,尽管这两个函数都成功结束
非常感谢您的帮助
解决方案
推荐阅读
- kubernetes - 你可以在 openshift 中不使用 statefulsets 运行 Zookeeper 集群吗?
- ios - UITextView 在 CollectionViewCell 内不显示键盘
- xcode - Bash:自动将文件添加到 Xcode 项目?
- regex - Regex - get "1,546 messages" string inside list
- vmware - 需要帮助从主机中的来宾访问 .html 文件 (VMWare 16)
- amazon-web-services - AWS Codepipeline Spring Boot War 文件
- bash - TEST_PROFILE="${1-}" 和 ${TEST_PROFILE-} 行中符号`-`的作用是什么?
- c# - 从字典中使用 Linq 仅选择指定的键
- email - Outlook 草稿邮件在发送时更改不可变 ID
- iis - IIS:应用程序池中的空闲超时设置