【发布时间】:2011-09-28 22:36:02
【问题描述】:
我目前正在用 C# 编写一个应用程序,我需要大约触发一个计时器。每 5 毫秒。从一些研究看来,最好的方法是使用 p/invoking timeBeginPeriod(...) 来更改系统计时器的分辨率。它在我的示例代码中运行良好。
我在 Larry Osterman 的 MSDN 博客this entry 上发现了一个关于使用此功能的有趣警告:
Adam:调用 timeBeginPeriod 也会提高 GetTickCount 的准确性。
总体而言,使用 timeBeginPeriod 是一个非常糟糕的主意 - 我们一直在积极地在 Windows 中删除它的所有用途,因为使用它会带来功耗后果。
有更好的方法可以确保您的线程及时运行。
有谁确切地知道为什么会发生这种情况,或者那些“更好的方法”(在线程中未指定)可能是什么?我们在谈论多少额外的功耗?
【问题讨论】:
-
顺便说一下,在“最佳”机器上,您不会得到超过 15.6 毫秒的时间。大多数情况下它将是 30 毫秒。不确定 HPET 是否有效果,所以要非常小心依赖 Windows 计时器。
-
Larry 知道,他写了那段代码。当然,不是每 1/64 秒,而是每毫秒将处理器从其 HLT 状态唤醒。效率降低 64 倍。没有人会调用 timeBeginPeriod(10)。