Joe*_*son 8 c++ qt multithreading
有许多Qt多线程教程说明QThread可以使用以下两行安全地停止a .
qthread.quit(); // Cause the thread to cease.
qthread.wait(); // Wait until the thread actually stops to synchronize.
Run Code Online (Sandbox Code Playgroud)
我有很多代码在执行此操作,并且在大多数情况下停止线程,我将始终设置自己的取消标志并在执行期间经常检查它(这是常态).到目前为止,我认为调用quit可能会导致线程不再执行任何等待信号(例如,排队的信号将不再调用其槽),但仍然等待当前正在执行的槽完成.
但我想知道我是对的,还是quit()实际上是停止了它所处的线程的执行,例如,如果某些事情未完成,就像文件描述符尚未关闭一样,它肯定应该是,尽管在大多数情况下我的工作者对象将清理这些资源,如果我确切知道戒烟是如何工作的,我会感觉更好.
我问这个是因为QThread::quit()文档说它"相当于调用QThread :: exit(0)".我相信这意味着线程会立即停在它所在的位置.但是,调用quit的堆栈帧会发生什么?
QThread::quit如果线程没有事件循环或线程中的某些代码阻塞事件循环,则不执行任何操作.所以它不一定会阻止线程.
所以QThread::quit告诉线程的事件循环退出.调用它之后,一旦控件返回到线程的事件循环,线程就会完成.
如果你阻塞事件循环,例如通过循环工作,你将不得不添加某种中止标志.这可以通过公共成员变量来完成,或者至少具有公共setter方法.然后,您可以通过设置中止标志告诉线程从外部(例如从主线程)退出ASAP.当然,这将要求您的线程代码定期检查中止标志.
你也可以强制一个线程立即通过QThread::terminate(),但这是一个非常糟糕的做法,因为它可能会终止线程在其代码中的未定义位置,这意味着你可能最终得到资源永远不会被释放和其他令人讨厌的东西.所以只有在你真的无法解决它时才使用它.从其文件:
警告:此功能很危险,不鼓励使用.线程可以在其代码路径中的任何位置终止.修改数据时可以终止线程.线程无法自行清理,解锁任何保持的互斥锁等.简而言之,只有在绝对必要时才使用此功能.
我认为这是在线程中使用循环时完成线程的好方法:
myThread->m_abort = true; //Tell the thread to abort
if(!myThread->wait(5000)) //Wait until it actually has terminated (max. 5 sec)
{
myThread->terminate(); //Thread didn't exit in time, probably deadlocked, terminate it!
myThread->wait(); //We have to wait again here!
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10630 次 |
| 最近记录: |