• 4947阅读
  • 4回复

[提问]QTimer定时原理请教 [复制链接]

上一主题 下一主题
离线oceanljp
 

只看楼主 倒序阅读 楼主  发表于: 2013-03-28
现象描述:
程序启动,启动一QTimer,定时5秒。在第一次触发时,程序休眠8秒。后面的触发,不休眠,程序继续运行。
(程序定时器触发时,打印程序已启动时间)
定时5秒,第一次休眠8秒,打印如下:
5,13,15,20。。。。
定时3秒,第一次休眠8秒,打印如下:
3,11,14,17。。。。


疑问:为什么定时3秒,第一次休眠8秒时,打印不是:
3,11,12,15


觉得应该是在3的倍数,即后两次应该是12,15时,QTimer触发。
而且在定时5秒,第一次休眠8秒时,后两次15,20秒的触发,都是5的倍数。


上述现象不解,求高手。


附程序代码,编译环境:Qt 4.7.3 + Fedora 10
测试程序 eventLoop_QTimer.tar.gz (11 K) 下载次数:13
离线oceanljp

只看该作者 1楼 发表于: 2013-03-28
用最新的qt-windows-opensource-5.0.1-mingw47_32-x86-offline.exe
windows(mingw)版本编译,

把程序中usleep(8 * 1000000)换成sleep
测试定时3秒,第一次8秒休眠的情况,打印如下:
3,12,15,18

更奇怪了,起码11秒的时候,应该有一次触发吧。。。。
离线jdwx

只看该作者 2楼 发表于: 2013-03-28
回 1楼(oceanljp) 的帖子
估计是系统的差异导致的。
系统:linux-mint13
再上图:
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线彩阳

只看该作者 3楼 发表于: 2013-03-28
我的也是这样。
上海Qt开发联盟,热忱地欢迎你的加入!
离线oceanljp

只看该作者 4楼 发表于: 2013-03-29
Qt跨平台,可这种细节性的差异很让人纠结啊。。。。。
不讨论window与Linux下的差异。

单看Linux下,定时5秒,第一次休眠8秒(打印5,13,15,20。。。。)
                         定时3秒,第一次休眠8秒(打印3,11,14,17。。。。)
这两种情况的规律也不一样。

第一种触发的情况,可以归纳为从定时器启动开始,每隔N秒触发一次。因此后两次触发为15,20(5的倍数)。
第二种触发的情况,可以归纳为从上一次触发算,过了N秒才触发。因此后两次触发为14,17(14 - 3  = 11)。

这是肿么回事呢。


话说哥是不是有些钻牛角尖了,*……*
快速回复
限100 字节
 
上一个 下一个