Qt多线程如何在关闭窗口时正确退出

当我们在跑非常耗时的多线程任务时,如果用户点击了关闭主窗口按钮,此时不处理的话,它虽然关闭了主窗口,但是程序其实会一直在跑的,还没有真正退出的,在任务管理器里还可以看到它,而且在debug窗口也会看到还在跑。

怎么办?

解决方法:
1、 窗口头文件中定义
public:
QThread thread;
Worker *ycthd;
实现文件 窗口构造函数添加::
this->setAttribute(Qt::WA_DeleteOnClose,true);
ycthd = new YcThread();
ycthd->moveToThread(&thread);
thread.start();
thread.setPriority(QThread::HighestPriority);
connect(this,&ABC::beginsignal,ycthd,&Worker ::beginslot);
connect(&thread, &QThread::finished, ycthd, &QObject::deleteLater);

2、窗口析构函数添加:
ycthd->isRun = false; //设置这个标志位,如果多线程还在跑,在跑的过程中判断这个值,false就退出循环
thread.quit();
thread.wait();//要阻塞等待线程完全跑完退出,不然delete会报错
//关闭窗口一阵子,就可以看到Worker 析构函数执行了,表明已经退出线程

3、开始计算的时候:
ycthd->isRun = true; //这个标志位允许程序持续跑
emit test();

结论:
1、不能用 this->thread->terminate(); 来终止线程,程序会挂掉。
2、多线程其实就是它在等待信号槽过来,有信号就启动运行槽函数,运行完就继续等待,啥也不帮你干。
3、当它啥也不干的时候,才可以安全退出它。
4、它没那么复杂,也不难理解,就像老板让一个工人帮他做事的时间里,你不能命令工人出去工厂外面休息,要让工人停止干活,你必须跟老板报告下,让老板不再让工人干他的事才行;当工人做完老板的事没活干了,你才能命令他出去工厂外面休息。

你可能感兴趣的:(QT)