原始问题描述为here。我理解提供的解决方案,我认为它应该工作。但并非一切都进展顺利。我遇到的问题是QThread::finished
并不总是被发出,或者由于某些原因并不总是调用QWidget::close()
。即有时我需要按两次关闭按钮。它适用于第二次按下,因为第一个工作线程完成,而closeEvent
中的工作线程不再被忽略。
仅当我尝试在主窗口可见后直接关闭应用程序时才会出现此问题。如果我等待几秒钟,应用程序会在第一次单击时关闭。
P.S。工作线程是无限的。
更新
为工作人员运行方法
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");
}
答案 0 :(得分:0)
不确定问题的真正原因,但这里有几个想法,可能有所帮助。
由于您只启动一次线程,因此最好将_isFinished = false;
行移动到构造函数中,以防您在初始化之前尝试关闭应用程序。
我还建议使用互斥锁保护_isFinished
变量。
bool WorkerThread::isFinished() const
{
QMutexLocker locker(&mutex);
return _isFinished;
}
如果需要_delay
变量来避免100%的CPU负载,则不必使其太大。通常1毫秒就足够了。