用于定期调用的现代高分辨率定时器

Modern high res timer for periodic calls

关于 Whosebug 上的高分辨率计时器的讨论很多。但很明显,解决方案是一个移动的目标,最佳实践也在改变。

我需要创建一个高分辨率计时器,每 10 毫秒回调一次,以实现一致的 100Hz。目标平台为Windows7及以后。

exact question was asked in 2009,但我相信事情可能已经发生了变化。

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

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

综上所述,在 C 今天.

中实现上述预期目标的最佳方法是什么?

but MSDN says they are depreciated

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

对企业不利,因为 Microsoft 喜欢在移动计算领域保持竞争力。多媒体定时器是一个非常糟糕的搭配,它们会扼杀电池寿命。大多数使用它们的程序都会将时钟中断率提高到允许的最大值,每秒 1000 次。有一个后门可以达到 2000。很难阻止他们这样做,尤其是当他们的竞争对手提供他们的软件时 away for free。他们没有任何动力去解决这个问题,因为这会使他们的手机 OS 看起来不错。并且微软不能像那样杀死非常流行的应用程序。

Microsoft 有一个移动 OS,通过 WinRT api 公开。如果弃用非常困难,那么当您使用这些计时器时,您的应用程序将无法通过商店验证程序获得批准。但它并没有多大用处,他们的客户喜欢继续使用他们的桌面应用程序。

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

你愿意边走边烧CPU吗?在繁忙的循环中调用 QueryPerformanceCounter()。您将获得微秒级的精度,并对电池寿命产生适当的不利影响。您还可以通过将进程优先级 class 提高到 REALTIME_PRIORITY_CLASS 并将工作线程的优先级提高到 THREAD_PRIORITY_TIME_CRITICAL (或降低一两个档次)来将其提高到 11。做这样的事情当然会有负面的后果。