我有一个用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计算机上运行,全局更改计时器分辨率的系统性负面影响无关紧要。
答案 0 :(得分:2)
使用SetTimer
无法使用小于 10ms 的分辨率。如果您尝试使用较低的值,Windows将只使用10毫秒。
您是否考虑过使用QElapsedTimer
?它使用Windows'默认情况下为高分辨率性能计数器,如果不可用,则会回退到不太精确的计时器。
答案 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毫秒。