0

原始问题在此处描述。我理解所提供的解决方案,我认为它应该可以工作。但并非一切都进展顺利。我遇到的问题QThread::finished并不总是发出或QWidget::close()由于某些原因并不总是被调用。即有时我需要按两次关闭按钮。它在第二次印刷机上工作,因为工作线程在第一次印刷机上完成,并且closeEvent不再被忽略。

仅当我尝试在主窗口可见后立即关闭应用程序时才会出现此问题。如果我等待几秒钟,应用程序会在第一次单击时关闭。

PS 工作线程是无限的。

更新

工人的运行方法

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");
}
4

1 回答 1

0

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

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

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

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

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

于 2013-05-25T14:59:51.790 回答