Qt,如何立即暂停 QThread

6

我有一个监听服务器的QThread。我想立即暂停QThread的工作。不需要等待,几乎像终止一样,必须立即执行。


2
你能提供一些代码吗?现在不清楚你的意思。正如你所看到的,msleep方法会立即暂停线程的工作。这是你想要的吗? - Kirill Chernikov
3
必须像刀子一样锋利。 - frogatto
运行 QThread 的函数会发出一个信号。我想通过这个信号来终止已经在运行的任务。 - DJ.Yosemite
你是在使用Qt网络类还是其他(阻塞式)监听调用?无论如何,这个问题需要相关的代码! - hyde
1个回答

22

在线程中运行的代码如果在任意点停止,可能会破坏共享数据结构的状态,或者破坏C/C++运行时或使用的其他库的状态。

代码只能在明确定义的点处停止。

如果您的线程运行事件循环(即通常情况下不派生自QThread或不覆盖其run),则QThread::quit()将在返回控制到事件循环时安全地停止线程。

如果您的线程重新实现了run并在其中执行循环,则应在请求中断时返回:

void MyThread::run() {
  while (! isInterruptionRequested()) {
    ...
  }
}

通过调用QThread::requestInterruption()可以停止这样的线程。

以下是一些有时会混淆的QThread方法参考:

  • wait() 阻塞调用线程直到被调用线程完成。当在线程内部调用该方法时,会导致即时死锁:如果等待的事件永远不会发生,那么线程就无法结束。

  • quit() 尽快退出线程的事件循环,并导致 QThread::run() 方法返回。如果你已经重新实现了 run() 方法并且没有启动事件循环,那么它将什么也不做。

  • requestTermination() 设置一个标志,一个自定义的循环可以通过 isTerminationRequested() 检查它。

  • terminate() 立即停止线程。这通常会损坏应用程序的状态,因此必须尽快使用 abort() 或面对后果。最好不要使用此方法。它基本上意味着“尽快崩溃此进程,如果有机会,请破坏一些磁盘数据”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接