• 629阅读
  • 8回复

[提问]关于定时器的疑问 [复制链接]

上一主题 下一主题
离线tanyue.esec
 

只看楼主 倒序阅读 楼主  发表于: 2023-11-28
有个需求是每分钟/十分钟执行一个任务,尝试了QTimer,QTimerEvent的方式,也尝试了setTimeerType的方式(=Qt::PreciseTimer)
最终的效果都是一样的,执行一段时间之后就有了几秒的偏差,不会在准点执行任务了。

Qt还有什么方式能保证在固定的时间点执行定时任务么
离线clickto

只看该作者 1楼 发表于: 2023-11-28
QTimer本来不是一个高精度的定时器,但是也不至于差几秒钟吧
把定时器或要执行的任务放在单独的一个线程试试看
离线tanyue.esec

只看该作者 2楼 发表于: 2023-11-29
也不是一次差出去这么多,每分钟执行一次,每次差个毫秒,累积起来就差出去好几秒了。
离线圣域天子

只看该作者 3楼 发表于: 2023-11-29
QTimer触发后,执行代码的时间和它在同一线程内的。
执行结束后才会重新开始计算启始时间点,所以慢慢的时间就出现偏差了
要精确就必须要从最初时间点进行校正的
离线tanyue.esec

只看该作者 4楼 发表于: 2023-11-30
这么看要精确定时执行,不能依赖api提供的配置了,只能靠进行校正了。
离线angelus

只看该作者 5楼 发表于: 2023-11-30
有一种方案就是 每次只单次触发,但是每次触发的最后,再次调用一次计时器,但计时器会有一段代码进行时间的校对,看看和第一次触发超了多少,那么这次触发就减少多少
离线snolkmg

只看该作者 6楼 发表于: 2023-11-30
如果程序是Windows上的,可以看看这个帖子 http://www.qtcn.org/bbs/read-htm-tid-65582.html
离线clearsky

只看该作者 7楼 发表于: 2023-11-30
回 tanyue.esec 的帖子
tanyue.esec:也不是一次差出去这么多,每分钟执行一次,每次差个毫秒,累积起来就差出去好几秒了。 (2023-11-29 08:27) 

这样的处理逻辑肯定会累积误差。其实可以设置为定时触发,每次触发后,让一个线程做工作,完成后自动退出或者等待新的触发。不需要每次设置定时器。
渴望  晴朗的天空
离线朝朝暮暮

只看该作者 8楼 发表于: 2023-12-15
QTimer 不是高精度时间计时。有两种方案
1.使用win32 api 获取系统的滴答值和CPU频率 + 线程,两次获取滴答值做差,再除以频率将获得秒。这样获得的时间精度为windows平台上最高的时间精度,秒级别单位没有误差,但是本质上要求精度更高时也会存在误差。
2.在windows平台上使用RTX实时操作系统,RTX系统下轻松满足实时性。 轻松满足毫秒级别。
小进步,大成就
快速回复
限100 字节
 
上一个 下一个