楼主:
worcdlo (worcdlo)
2021-06-17 10:27:11想请教各位,都如何在C++实现一个足够"精准"的计时器?
(假设我把精准定义在,24hr累积误差不超过1秒)
我们在播放影片时,可能要刚好每1/40秒换一张照片;或玩游戏时
跑步速度为每秒5格等。要实现这些,想像中都要有很精准的时钟。
在我过去的经验中,每十秒打一次hearbeat,但如果依赖while sleep(10s),
平均下来可能每分钟5.9笔,毕竟CPU交换资料以及执行少量程式码都会花掉一
些时间,导致我需要把10s再调低一些。
类似这种状况,想请教各位大大
是否有什么方式能让程式能优雅又几乎精准的在特定时间执行?
这里的特定时间又分成周期式执行,及刚好在指定时间执行两种。
或是有什么可供搜寻用的名词吗?
std::chrono::high_resolution_clock
楼主:
worcdlo (worcdlo)
2021-06-17 10:48:00这个是精度高的"时钟",其实我想问的问题比较像是:除了狂戳之外,如何优雅的让程式在准确时间执行
楼主:
worcdlo (worcdlo)
2021-06-17 10:56:00所以就是我原本的作法? 但如果这个程式可能被布署在多个环境的话,是要动态的调整sleep时间的意思吗?
sleep(targetTime - clock::now()); DoYourWork();
作者:
g0010726 (Kevin)
2021-06-17 14:03:00楼上的做法可以用sleep_until
作者:
Caesar08 (Caesar)
2021-06-17 22:18:00sleep_until
作者:
CoNsTaR ((const *))
2021-06-18 02:01:00可以改成在绝对时时间触发,不要用相对时间
每次睡前先看时钟你还有多少时间可以睡,而不是不管醒著时花了多少时间做事都固定睡十秒当然用绝对时间触发也行,省得自己计算
作者:
F04E (Fujitsu)
2021-06-18 09:51:00这牵扯到OS OS不准APP也准不起来
作者: kkrun (ultimate k) 2021-06-18 14:18:00
只有硬即时作业系统,才可能保证response time,其他作业系统只能做到best effort。你举的例子,可以使用signal timer来解决,Linux有提供timer_create()相关函数
作者:
CoNsTaR ((const *))
2021-06-18 21:00:00或是触发时间分成 expect 和 actual,每次计算下次出发时间的时候用上次的 expect + offset,不要用 actual + offset