在应用程序关闭期间正确关闭线程,该线程可能会长时间运行循环

时间:2019-07-16 09:19:52

标签: c++ qt qthread

因此,我有一个处理图像的类,即,水平镜像或垂直镜像等。该类在其单独的线程中运行。

m_imageMirrorer = new ImageMirrorer();
m_imageMirrorer->moveToThread(&m_thread);
m_thread.start();
connect(&m_thread, &QThread::finished, this, &QObject::deleteLater);

现在,要在用户随机关闭应用程序时正确关闭线程,我在析构函数中添加了以下代码。

    m_thread.quit();
    if(!m_thread.wait(3000)) //Wait until it actually has terminated (max. 3 sec)
    {
        m_thread.terminate(); //Thread didn't exit in time, probably deadlocked, terminate it!
        m_thread.wait(); //We have to wait again here!
    }

    if(m_imageMirrorer)
    {
        delete m_imageMirrorer;
    }

实际上,我最初尝试在析构函数中根本不使用quit()中的wait()terminate()m_thread。但是,它始终会给出错误QThread: Destroyed while thread is still runningdeleteLater并没有采取任何措施来避免那次特定的崩溃。

我现在正确地执行了吗?

谢谢。

1 个答案:

答案 0 :(得分:2)

本质上,您将使用原子完成此类任务。但是Qt已经集成了一种可以做到这一点的机制。

https://doc.qt.io/qt-5/qthread.html#isInterruptionRequested,由requestInterruption触发。

在运行任务时,您可以集成支票if (QThread::currentThread()->isInterruptionRequested()),然后干净地结束计算/任务。这会增加开销,因此不应每隔纳秒检查一次。