在运行过程中删除Qthread

问题描述 投票:0回答:1

我创建了一个带有类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
    }
}
multithreading qt qt5 qthread
1个回答
1
投票

来自文档:

请注意,删除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

© www.soinside.com 2019 - 2024. All rights reserved.