代码之家  ›  专栏  ›  技术社区  ›  Sijith

在运行过程中删除Qthread

  •  0
  • Sijith  · 技术社区  · 8 年前

    我用类a创建了一个线程,在删除类a后,线程不会被删除。它继续运行。

    我显式调用了线程析构函数、quit和exit函数,但线程仍然没有停止运行。

    有没有像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
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Konrad    8 年前

    从文档中:

    请注意,删除QThread对象不会停止其管理的线程的执行。删除正在运行的QThread(即isFinished()返回false)将导致程序崩溃。在删除QThread之前,等待finished()信号。

    永远不要删除正在运行的QThread对象。

    因此,我认为最好在WorkerThread中编写一些终止/退出逻辑,例如公开一些插槽 quit 并将信号与此连接 退出 狭槽

    如果您只是想终止线程,只需连接销毁的信号来终止插槽( http://doc.qt.io/qt-5/qthread.html#terminate )

    因此,假设您的A类派生自QObject,那么您将在该类中执行以下操作:

    connect(this, SIGNAL(destroyed()), Thread, terminate());

    如果你有自己的位置 退出 暴露,所以您要确保正确地停止循环中执行的所有内容 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