在Windows上更改SetTimer分辨率

时间:2014-07-07 02:10:11

标签: c++ winapi windows-7 timer qt4

我有一个用Qt 4.8编写的应用程序,它使用Qt的计时器工具定期触发周期性事件(通过QObject::startTimer(),事件发布到拥有的QThread的消息队列中)。 Qt最终调用Windows API函数SetTimer在Windows上设置计时器。

Windows上的默认分辨率为15.6ms。我需要20ms +/- 0.5ms的时间段。但是,当我指定20ms时,我实际上得到31.2ms(+/- 0.02ms)。当我指定10ms(仅用于踢)时,我得到15.6ms。这与默认分辨率一致。我需要将分辨率设为19.5-20.5(例如0.5,1,2,4,5,10甚至20)。

我尝试使用timeBeginPeriod / timeEndPeriod,报告成功,但没有效果 - 我认为这仅适用于winmm计时器,而不是SetTimer

Qt计时器受平台基础计时器分辨率的支配,所以我必须超越它。

我有什么方法可以设置SetTimer的分辨率吗?我可以进行特定于Windows的API调用。我也可以在全球范围内进行,即使它归结为注册表黑客攻击。该应用程序在专用的Windows 7计算机上运行,​​全局更改计时器分辨率的系统性负面影响无关紧要。

2 个答案:

答案 0 :(得分:2)

使用SetTimer无法使用小于 10ms 的分辨率。如果您尝试使用较低的值,Windows将只使用10毫秒。

您是否考虑过使用QElapsedTimer?它使用Windows'默认情况下为高分辨率性能计数器,如果不可用,则会回退到不太精确的计时器。

http://qt-project.org/doc/qt-4.8/qelapsedtimer.html

答案 1 :(得分:1)

关于QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)的Qt文档:

  

请注意,QTimer的准确性取决于底层操作系统   和硬件。 timerType参数允许您自定义   计时器的准确性。有关的信息,请参阅Qt :: TimerType   不同的计时器类型大多数平台支持20的准确度   毫秒;一些提供更多。如果Qt无法交付   请求的计时器事件数量,它会默默地丢弃一些。

我认为您可以将计时器类型设置为Qt::PreciseTimer。在Windows上,Qt将使用Windows's Multimedia timer工具(如果可用)用于此类型,其分辨率为1毫秒。