Multithreading 未发出QThread::finished()或未调用QWidget::close()
描述了原始问题。我理解提供的解决方案,我认为它应该有效。但并非所有事情都进展顺利。我的问题是,由于某些原因,Multithreading 未发出QThread::finished()或未调用QWidget::close(),multithreading,qt,signals-slots,Multithreading,Qt,Signals Slots,描述了原始问题。我理解提供的解决方案,我认为它应该有效。但并非所有事情都进展顺利。我的问题是,由于某些原因,QThread::finished并不总是被发出,或者QWidget::close()并不总是被调用。i、 e有时我需要按两次关闭按钮。它在第二次按下时工作,因为工作线程在第一次按下时完成,并且在closeEvent中,事件不再被忽略 只有当我在主窗口可见后立即尝试关闭应用程序时,才会出现此问题。如果我等待几秒钟,应用程序将在第一次单击时关闭 另外,工作线程是无限的 更新 worker的R
QThread::finished
并不总是被发出,或者QWidget::close()
并不总是被调用。i、 e有时我需要按两次关闭按钮。它在第二次按下时工作,因为工作线程在第一次按下时完成,并且在closeEvent
中,事件不再被忽略
只有当我在主窗口可见后立即尝试关闭应用程序时,才会出现此问题。如果我等待几秒钟,应用程序将在第一次单击时关闭
另外,工作线程是无限的
更新
worker的Run方法
virtual void
run() {
PRINT("Simulation Started at Thread %d", QThread::currentThread());
_isFinished = false;
double position = 0.0;
// Some calculations
emit updated();
while (!_isFinished) {
_mutex.lock();
if (_isPaused)
_waitCondition.wait(&_mutex);
_mutex.unlock();
if (_isFinished)
break;
QThread::msleep(_delay);
// some calculations;
emit updated();
}
PRINT("Simulation Finished");
}
不确定你问题的真正原因,但这里有一些想法,可能会有所帮助 由于您只启动一次线程,因此最好移动
\u isFinished=false代码>行到构造函数,以防在此初始化之前尝试关闭应用程序
我还建议使用互斥锁保护\u isFinished
变量
bool WorkerThread::isFinished() const
{
QMutexLocker locker(&mutex);
return _isFinished;
}
如果需要\u delay
变量来避免100%的CPU负载,则无需将其设置得太大。通常1毫秒就足够了。你能给我们看看你的线程的运行方法吗?请看更新。延迟多少?我想这可能是问题所在。我可以将它从0更改为任何值。但通常在50到300之间。我按照你的建议做了,但问题还没有解决。您知道close()
无法接收finished()
信号的原因吗?因为我确信已发送了finished()
。如果在closeEvent
仍在运行时收到了信号,该怎么办?在退出之前,尝试在run
方法的末尾添加msleep(100)
。我尝试了,但没有解决。您描述的情况无法发生,因为没有并发。将在gui线程中调用close()
,因为Qt::AutoConnection-(默认值)如果信号是从接收对象以外的线程发出的,则信号将排队,表现为Qt::QueuedConnection。否则,将直接调用插槽,其行为类似于Qt::DirectConnection。连接类型在发出信号时确定。