在Windows上更改Qt的计时器分辨率

Changing Qt's timer resolution on Windows

本文关键字:计时器 分辨率 Qt Windows      更新时间:2023-10-16

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

Windows的默认分辨率是15.6ms。我需要一个20毫秒+/- 0.5毫秒的周期。然而,当我指定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机器上,全局更改计时器分辨率对整个系统的负面影响是无关紧要的。

使用SetTimer时不可能使用小于10ms的分辨率。如果您尝试使用较低的值,Windows将直接使用10ms。

你考虑过用QElapsedTimer代替吗?它默认使用Windows的高分辨率性能计数器,如果不可用,则返回到不太精确的计时器。

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

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

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

我认为你可以设置定时器类型为Qt::PreciseTimer。在Windows上,Qt将使用Windows的多媒体定时器功能(如果可用)来处理这种类型,其分辨率为1毫秒。