Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 未发出QThread::finished()或未调用QWidget::close()_Multithreading_Qt_Signals Slots - Fatal编程技术网

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。连接类型在发出信号时确定。