关于在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函数的结束与开始!!!

猜你喜欢

转载自blog.csdn.net/thequitesunshine007/article/details/128331169
今日推荐