关于在QT子线程中使用QTimer的几点体会

1)QTimer的启动与停止,只能在同一个线程中进行。

2)主线程发送信号后,让子线程去控制QTimer启动,但QTimer会奇怪的不启动(无法触发定时器timeout槽函数)。但可以在主线程里面去启动子线程的QTimer对象(要暴露出public接口),同样也可以在主线程里面去关闭子线程的QTimer对象。

3)在程序退出时,当子线程中的QTimer还在运行时,会出现错误,应该先关闭子线程中的QTimer。

4) 在子线程的QTimer回调槽函数内,如果使用QCoreApplication::processEvents();在QTimer超时时间较短或者槽函数耗时较久时,会导致递归调用,导致栈溢出!

详情参见:Qt QCoreApplication:processEvents()可能会引起递归,导致栈溢出崩溃_mob604756ff6c49的技术博客_51CTO博客

 

 

那在子线程的QTimer回调槽函数内,如果不使用QCoreApplication::processEvents()。 当其他线程往本子线程发送一个信号时,有可能需要较久的时间才能去处理该信号(比如timer的timeout比较小时)。

 5)个人不太建议在QT子线程中使用QTimer做一些定时任务,操作起来不是很友好,尤其是在启动、退出、消息处理实时性把控等方面。

可以采用图下的类似方式处理,简单便捷:

 volatile bool g_isRunning变量也可以很简便的控制子线程Work函数的结束与开始!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

thequitesunshine007

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值