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()尽快或承担后果.这种方法最好被遗忘.它本质上意味着"很快崩溃这个过程,如果你有机会破坏一些磁盘数据".