如何在 Qt 中正确终止 QThread?

Posted

技术标签:

【中文标题】如何在 Qt 中正确终止 QThread?【英文标题】:How to properly terminate QThread in Qt? 【发布时间】:2016-06-30 07:12:35 【问题描述】:

这是终止线程的正确方法吗...

 if(m_ReviewImageThreadLoader !=NULL)
 
   m_ReviewImageThreadLoader->quit();
   m_ReviewImageThreadLoader->wait();
   m_ReviewImageThreadLoader->terminate();
   delete m_ReviewImageThreadLoader;
   m_ReviewImageThreadLoader = NULL;
   qDebug()<<"m_ReviewImageThreadLoader closed"<<endl;
 

...其中m_ReviewImageThreadLoader 是线程对象。

【问题讨论】:

Does QThread::quit() immediately end the thread or does it wait until returning to the event loop?的可能重复 【参考方案1】:

您的问题的答案在很大程度上取决于您的线程上正在完成的工作的性质。如果用法类似于...

QThread *m_ReviewImageThreadLoader = new QThread;
MyObject *mo = new MyObject;
mo->moveToThread(m_ReviewImageThreadLoader);
m_ReviewImageThreadLoader->start();

那么您的代码应该没问题(尽管您确实不需要调用terminate())。

另一方面,如果m_ReviewImageThreadLoader 是派生自QThread 的类型并且已明确覆盖QThread::run,那么您需要提供更多信息才能回答您的问题。

您是否尝试过您的代码?它看起来有效吗?

【讨论】:

嗨,GM,感谢您的回复,我已经创建了我的对象,例如: m_ReviewImageThreadLoader = new ReviewImageThreadLoader(); m_ReviewImageThreadLoader 是 Qthread 和 m_ReviewImageThreadLoader 自己继承的,不需要为此创建新类。如果你使用这样的线程,现在我想删除线程。我要求删除线程的过程。在这种情况下,这段代码可以正常工作 if(m_ReviewImageThreadLoader !=NULL) m_ReviewImageThreadLoader->quit(); m_ReviewImageThreadLoader->terminate();删除 m_ReviewImageThreadLoader; m_ReviewImageThreadLoader = NULL; qDebug()

以上是关于如何在 Qt 中正确终止 QThread?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt:如何终止可重用的 QThread

如何在 QT 中停止 qThread [重复]

Qt系列文章之三十四 (线程题外话---从pthread 到QThread)

Qt系列文章之三十四 (线程题外话---从pthread 到QThread)

Qt中如何设置按钮点击终止线程

ubuntu QT写抓包程序,用到qThread,动态显示分析后的数据,但是程序运行一段时间后出现“程序异常终止”