我创建了一个带有类A的线程,在删除了类A之后,该线程不会被删除。它继续运行。
我明确地调用了线程析构函数,退出并退出函数,但仍然,线程没有停止运行。
是否有任何像KILL函数来停止线程执行
void A::init()
{
WorkerThread *Thread = new WorkerThread(this);
}
void B::slotClose()
{
A *obj = getObj();
if(obj)
{
m_pScene->removeItem(obj);
obj->deleteLater(); // this calls thread distructor also but thread execution is not stopping
}
}
来自文档:
请注意,删除QThread对象不会停止执行它管理的线程。删除正在运行的QThread(即isFinished()返回false)将导致程序崩溃。在删除QThread之前等待finished()信号。
您永远不应删除正在运行的QThread对象。
所以我认为你最好在WorkerThread中编写一些终止/退出逻辑,暴露一些插槽,例如quit
,并用这个quit
插槽连接信号。
如果你只是想终止线程无论如何,只需连接被破坏的SIGNAL来终止SLOT(http://doc.qt.io/qt-5/qthread.html#terminate)
所以假设你的A类派生自QObject,你会在这个类中做什么:
connect(this, SIGNAL(destroyed()), Thread, terminate());
如果你有自己的插槽quit
暴露,所以你确保你正确地停止在循环中执行的所有,而terminate()
使用quit()
。
connect(this, SIGNAL(destroyed()), Thread, quit());
这是一个实现这样一个逻辑的例子:http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/
或者只是将quit = true
放在ThreadWorker析构函数中。
它应该是直截了当的。祝好运!
还有一些带有示例的官方文档(imo正确执行):
https://wiki.qt.io/QThreads_general_usage
https://doc.qt.io/archives/qt-5.8/qtnetwork-blockingfortuneclient-example.html
https://doc.qt.io/archives/qt-5.8/qtcore-threads-mandelbrot-example.html