因此,我有一个处理图像的类,即,水平镜像或垂直镜像等。该类在其单独的线程中运行。
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 running
。 deleteLater
并没有采取任何措施来避免那次特定的崩溃。
我现在正确地执行了吗?
谢谢。
答案 0 :(得分:2)
本质上,您将使用原子完成此类任务。但是Qt已经集成了一种可以做到这一点的机制。
https://doc.qt.io/qt-5/qthread.html#isInterruptionRequested,由requestInterruption触发。
在运行任务时,您可以集成支票if (QThread::currentThread()->isInterruptionRequested())
,然后干净地结束计算/任务。这会增加开销,因此不应每隔纳秒检查一次。