作者worcdlo ()
看板C_and_CPP
标题[问题] C++如何实现精准的计时器
时间Thu Jun 17 10:27:11 2021
想请教各位,都如何在C++实现一个足够"精准"的计时器?
(假设我把精准定义在,24hr累积误差不超过1秒)
我们在播放影片时,可能要刚好每1/40秒换一张照片;或玩游戏时
跑步速度为每秒5格等。要实现这些,想像中都要有很精准的时钟。
在我过去的经验中,每十秒打一次hearbeat,但如果依赖while sleep(10s),
平均下来可能每分钟5.9笔,毕竟CPU交换资料以及执行少量程式码都会花掉一
些时间,导致我需要把10s再调低一些。
类似这种状况,想请教各位大大
是否有什麽方式能让程式能优雅又几乎精准的在特定时间执行?
这里的特定时间又分成周期式执行,及刚好在指定时间执行两种。
或是有什麽可供搜寻用的名词吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 180.176.57.68 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1623896833.A.E72.html
1F:推 flarehunter: std::chrono::high_resolution_clock 06/17 10:40
2F:→ worcdlo: 这个是精度高的"时钟",其实我想问的问题比较像是: 06/17 10:48
3F:→ worcdlo: 除了狂戳之外,如何优雅的让程式在准确时间执行 06/17 10:50
※ 编辑: worcdlo (180.176.57.68 台湾), 06/17/2021 10:53:00
4F:→ nh60211as: 记你少量程式码花的时间然後睡10s-那个时间 06/17 10:54
5F:→ worcdlo: 所以就是我原本的作法? 但如果这个程式可能被布署在多个 06/17 10:56
6F:→ worcdlo: 环境的话,是要动态的调整sleep时间的意思吗? 06/17 10:57
7F:推 flarehunter: sleep(targetTime - clock::now()); DoYourWork(); 06/17 10:59
8F:→ g0010726: 楼上的做法可以用sleep_until 06/17 14:03
9F:→ Caesar08: sleep_until 06/17 22:18
10F:推 CoNsTaR: 可以改成在绝对时时间触发,不要用相对时间 06/18 02:01
11F:推 Schottky: 每次睡前先看时钟你还有多少时间可以睡, 06/18 03:37
12F:→ Schottky: 而不是不管醒着时花了多少时间做事都固定睡十秒 06/18 03:37
13F:→ Schottky: 当然用绝对时间触发也行,省得自己计算 06/18 03:38
14F:→ F04E: 这牵扯到OS OS不准APP也准不起来 06/18 09:51
15F:推 kkrun: 只有硬即时作业系统,才可能保证response time,其他作业 06/18 14:18
16F:→ kkrun: 系统只能做到best effort。你举的例子,可以使用signal ti 06/18 14:18
17F:→ kkrun: mer来解决,Linux有提供timer_create()相关函数 06/18 14:18
18F:推 CoNsTaR: 或是触发时间分成 expect 和 actual,每次计算下次出发 06/18 21:00
19F:→ CoNsTaR: 时间的时候用上次的 expect + offset,不要用 actual + o 06/18 21:00
20F:→ CoNsTaR: ffset 06/18 21:00