【发布时间】:2014-08-27 10:33:58
【问题描述】:
我有一个使用 Qt 4.8 编写的应用程序,它使用 Qt 的计时器工具定期触发周期性事件(通过QObject::startTimer(),将事件发布到拥有的QThread 的消息队列中)。 Qt 通过最终调用 Windows API 函数 SetTimer 在 Windows 上设置计时器。
Windows 上的默认分辨率为 15.6 毫秒。我需要 20 毫秒 +/- 0.5 毫秒的时间。但是,当我指定 20 毫秒时,我实际上得到了 31.2 毫秒(+/- 0.02 毫秒)。当我指定 10 毫秒(仅用于踢球)时,我得到 15.6 毫秒。这都与默认分辨率一致。我需要分辨率为 19.5-20.5 的某个因子(例如 0.5、1、2、4、5、10,甚至 20)。
我尝试使用 timeBeginPeriod/timeEndPeriod,它报告成功,但没有效果 - 我认为这仅适用于 winmm 计时器,不适用于 SetTimer。
Qt 定时器受平台底层定时器分辨率的支配,所以我不得不考虑一下。
有什么方法可以设置SetTimer 的分辨率吗?我可以进行特定于 Windows 的 API 调用。我也可以在全球范围内这样做,即使它归结为注册表黑客。该应用程序在专用的 Windows 7 机器上运行,全局更改计时器分辨率对系统范围的负面影响是微不足道的。
【问题讨论】:
-
我几乎想知道我是否应该在 SU 上问这个...
-
原来
SetTimer不能设置小于10ms msdn.microsoft.com/en-us/library/windows/desktop/… -
@AndrewDunn 是的;我已经进一步澄清了我的问题。我实际上需要 19.5-20.5ms 的时间,这是我用 15.6ms 的分辨率无法达到的。
-
您是否正在运行优化的构建?你可能会得到开销
-
@AndrewDunn 我是。我还在一个最小的测试程序中看到了相同的结果,该程序只是启动一个周期性计时器并打印时间增量(使用性能计数器)。与15.6ms默认分辨率非常一致;我看到 15.6 毫秒 +/- 0.02 毫秒的倍数。
标签: c++ winapi windows-7 timer qt4