我正在尝试使用QThread
来调用另一个线程中的函数,而不需要冻结UI。我在windows和linux上都使用QT5.11.2。
在windows上一切都很好,但QThread
的wait((函数无论如何都不会返回。
我在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
}
似乎不管怎样,这根线都不知道它已经完成了。
我能做些什么来解决这个问题或检查为什么会发生这种情况?
- 您还没有
start()
线程 - gui线程中的
myThread->wait();
等待线程终止,因此它阻止了gui线程事件循环,因此您失去了这种线程方式的所有好处,还不如只执行Configure(value);
而不执行线程
文档说明:
wait((和sleep((函数在一般来说,因为Qt是一个事件驱动的框架。而不是wait((,考虑监听finished((信号。而不是sleep((函数,请考虑使用QTimer。