定期呼叫的现代高分辨率计时器

时间:2015-03-21 11:39:34

标签: c++ c windows timer

关于stackoverflow的高分辨率计时器已经说了很多。但很明显,解决方案是一个移动目标,最佳实践正在发生变化。

我需要创建一个高分辨率计时器,每10ms回调一次,以达到100Hz的一致性。目标平台是Windows 7及更高版本。

exact question was asked in 2009,但我相信事情可能已经开始了。

多媒体计时器看起来是一个很好的解决方案,但MSDN说它们是depreciated,取而代之的是CreateTimerQueueTimer。但是stackoverflow的其他答案表明CreateTimerQueue计时器不如timeSetEvent准确。

所有答案都会一直指出使用timeBeginPeriod将Windows计时器分辨率设置为较低值的要求。

所以尽管如此,在今天的C 中实现上述目标的最佳方法是什么

2 个答案:

答案 0 :(得分:2)

  

但是MSDN说它们已被折旧

当您看到这样的弃用警告时,能够在行之间进行读取非常重要。是的,微软肯定希望每个人都停止使用多媒体计时器。他们被严重滥用,对业务非常不利。实际上让程序员停止使用它们是一个梦想,CreateTimerQueueTimer()不是替代方案。

对业务不利,因为微软喜欢在移动计算方面具有竞争力。多媒体计时器是一个非常糟糕的比赛,他们是电池寿命谋杀。大多数使用它们的程序将时钟中断率提高到允许的最大值,每秒1000次。有一个后门可以达到2000.并且很难阻止他们这样做,特别是当他们的竞争对手提供他们的软件时away for free。他们没有任何动力解决这个问题,因为它使他们的移动操作系统看起来很好。微软无法杀死非常受欢迎的应用程序。

Microsoft 有一个移动操作系统,通过WinRT api公开。如果弃用很难实现,那么在使用这些定时器时,您无法通过商店验证程序批准您的应用。但它并没有多大用处,他们的客户喜欢继续使用他们的桌面应用程序。

如果您想要100 Hz的更新速率,那么 使用timeBeginPeriod()和timeSetEvent(),没有其他办法。并避免WinRT。由于它实际上只比默认值差1.5倍,所以没有明显的理由担心功耗。将激光设置为眩晕并使用有效的方法。

答案 1 :(得分:0)

您是否愿意随时随地刻录CPU?在繁忙的循环中调用QueryPerformanceCounter()。您将获得微秒精度,对电池寿命产生适当的不利影响。您还可以将您的流程优先级等级提升到REALTIME_PRIORITY_CLASS并将工作线程的优先级提升到THREAD_PRIORITY_TIME_CRITICAL(或者低一个或两个等级)。做这些事当然会产生负面影响。