qt 等待线程结束_Qt优雅地结束线程(两种方法都是用Mutex锁住bool变量进行修改,然后由bool变量控制耗时动作的退出,即正常退出)...

本文介绍了在Qt中如何优雅地结束线程,避免在程序退出时出现线程仍在运行的问题。通过两种方法:1. 使用QMutex互斥锁和bool变量控制线程退出;2. 利用Qt5的requestInterruption()和isInterruptionRequested()接口。详细解析了这两种方法的实现原理和使用场景。
摘要由CSDN通过智能技术生成

如果一个线程运行完成,就会结束。可很多情况并非这么简单,由于某种特殊原因,当线程还未执行完时,我们就想中止它。

不恰当的中止往往会引起一些未知错误。比如:当关闭主界面的时候,很有可能次线程正在运行,这时,就会出现如下提示:

QThread: Destroyed while thread is still running

这是因为次线程还在运行,就结束了UI主线程,导致事件循环结束。这个问题在使用线程的过程中经常遇到,尤其是耗时操作。

在此问题上,常见的两种人:

1.直接忽略此问题。

2.强制中止 - terminate()。

大多数情况下,当程序退出时,次线程也许会正常退出。这时,虽然抱着侥幸心理,但隐患依然存在,也许在极少数情况下,就会出现Crash。

正如前面提到过terminate(),比较危险,不鼓励使用。线程可以在代码执行的任何点被终止。线程可能在更新数据时被终止,从而没有机会来清理自己,解锁等等。。。总之,只有在绝对必要时使用此函数。

所以,我们应该采取合理的措施来优雅地结束线程,一般思路:

1.发起线程退出操作,调用quit()或exit()。

2.等待线程完全停止,删除创建在堆上的对象。

3.适当的使用wait()(用于等待线程的退出)和合理的算法。

下面介绍两种方式:

一.QMutex互斥锁 + bool成员变量。

这种方式是Qt4.x中比较常用的,主要是利用“QMu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值