QThread :: finished()未发出或QWidget :: close()未被调用

时间:2013-05-24 21:39:37

标签: multithreading qt signals-slots

原始问题描述为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");
}

1 个答案:

答案 0 :(得分:0)

不确定问题的真正原因,但这里有几个想法,可能有所帮助。

由于您只启动一次线程,因此最好将_isFinished = false;行移动到构造函数中,以防您在初始化之前尝试关闭应用程序。

我还建议使用互斥锁保护_isFinished变量。

bool WorkerThread::isFinished() const
{
    QMutexLocker locker(&mutex);
    return _isFinished;
}

如果需要_delay变量来避免100%的CPU负载,则不必使其太大。通常1毫秒就足够了。