Qt,如何立即暂停QThread

DJ.*_*ite 2 qt qthread

我有一个QThread监听服务器.我想QThread立即暂停工作.不等待,但几乎像终止,它必须立即.

Rei*_*ica 16

在任何给定线程中运行的代码都不能在任意点停止,而不会破坏代码和/或C/C++运行时或任何其他使用的库中的共享数据结构的状态.

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

如果你的线程运行一个事件循环(即通常是你没有派生QThread或不重写它run),那么QThread::quit()一旦它将控制返回到事件循环就会停止线程,这样做是安全的.

如果你的线程重新实现运行并在那里执行循环,它应该在请求中断时返回:

void MyThread::run() {
  while (! isInterruptionRequested()) {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

这样的线程是可以阻止的QThread::requestInterruption().

作为参考,以下QThread是有时混淆的各种方法:

  • wait()阻塞调用线程,直到被调用的线程完成.当然,从线程本身调用它是即时死锁:如果一个线程等待永远不会发生的事情,它就无法完成.

  • quit()尽早退出线程的事件循环,然后QThread::run()返回.如果您重新实现run()并且不旋转事件循环,它什么都不做.

  • requestTermination()设置一个自定义循环YourThread::run()可以通过检查的标志isTerminationRequested().

  • terminate()现在停止线程.这通常会破坏您的申请状态,因此您必须abort()尽快或承担后果.这种方法最好被遗忘.它本质上意味着"很快崩溃这个过程,如果你有机会破坏一些磁盘数据".