我有一个QThread
监听服务器。我想立即暂停QThread
的工作。不等待,但几乎像终止,它必须立即。
答案 0 :(得分:16)
在任何给定线程中运行的代码都不能在任意点停止,而不会破坏代码和/或C / C ++运行时或任何其他使用的库中的共享数据结构的状态。
代码只能在明确定义的点停止。
如果你的主题运行了一个事件循环(即通常如果你不是来自QThread
或者不要覆盖它的run
),那么QThread::quit()
将会停止线程一旦将控制权返回给事件循环,就可以安全地执行此操作。
如果您的线程重新实现运行并在那里执行循环,它应该在请求中断时返回:
void MyThread::run() {
while (! isInterruptionRequested()) {
...
}
}
此类帖子可由QThread::requestInterruption()
停止。
供参考,以下是QThread
的各种方法,有时会混淆:
wait()
阻塞调用线程,直到被调用的线程完成。当然,从线程内部调用它本身就是即时僵局:如果一个线程等待永远不会发生的事情,它就无法完成。
quit()
尽早退出线程的事件循环,并导致QThread::run()
返回。如果您重新实现run()
并且不会旋转事件循环,则不会执行任何操作。
requestTermination()
设置一个标记,YourThread::run()
中的自定义循环可以通过isTerminationRequested()
进行检查。
terminate()
停止现在主题。这通常会破坏您的应用程序的状态,因此您必须尽快abort()
或面临后果。这种方法最好被遗忘。它本质上意味着很快就会崩溃这个过程并在你有机会的时候损坏一些磁盘数据"。