在应用程序关闭期间正确关闭一个可能运行很长时间循环的线程[重复]
Posted
技术标签:
【中文标题】在应用程序关闭期间正确关闭一个可能运行很长时间循环的线程[重复]【英文标题】:Properly closing a thread, that runs possible long for loops, during the closure of an application [duplicate] 【发布时间】:2019-07-16 09:19:52 【问题描述】:所以,我有一个操作图像的类,即水平镜像或垂直镜像等。这个类在其单独的线程中运行。
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;
我实际上最初尝试在析构函数中根本没有使用m_thread
的quit()
、wait()
、terminate()
。但后来它总是给出错误QThread: Destroyed while thread is still running
。 deleteLater
没有做任何事情来避免那次特定的崩溃。
我现在做对了吗?
谢谢。
【问题讨论】:
强制终止线程通常是个坏主意。而是设置一个(原子)标志,线程检查它是否应该退出。 @Someprogrammerdude 感谢您的回复。可以举个小例子。 【参考方案1】:基本上你会用原子来完成这种任务。然而,Qt 已经集成了一种机制来做到这一点。
https://doc.qt.io/qt-5/qthread.html#isInterruptionRequested 由 requestInterruption 触发。
在运行您的任务时,您可以集成检查if (QThread::currentThread()->isInterruptionRequested())
,然后干净地结束您的计算/任务。这会增加开销,因此不应每纳秒检查一次。
【讨论】:
以上是关于在应用程序关闭期间正确关闭一个可能运行很长时间循环的线程[重复]的主要内容,如果未能解决你的问题,请参考以下文章
与 C 和 C++ 相比,为啥 c# 代码需要很长时间才能执行 [关闭]
在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法