在Windows上更改Qt的计时器分辨率
Changing Qt's timer resolution on Windows
我有一个用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毫秒。
- Linux的Cpp上的计时器
- 提升 ASIO 无法识别计时器对象
- 提升 asio 并发计时器取消问题与链
- 使用单体计时器的pthread_cond_timedwait有时会比预期晚超时
- 窗口中的微秒计时器
- 计时器是否从另一个线程启动?
- 如何在 c++ 中创建计时器
- C++回调计时器实现
- 在计时器或主线程外部的命令上销毁/替换线程
- 如何制作每秒从 30 乘 1 倒计时的计时器?
- 保留计时器集合(对象与指针)的最佳方法
- 在网络套接字计时器滴答后增加asio短读错误
- 是否可以仅使用标准 c++/c++11 实现不带"sleep"的计时器?
- 在没有NtSetTimerResolution的Windows上提高计时器分辨率(高分辨率)
- 实现高分辨率计时器的最佳方法
- 如何获取当前的 Windows 系统范围的计时器分辨率
- 高分辨率计时器与低分辨率计时器
- Windows(也包括OS X、Linux)上Qt中的高分辨率定期计时器
- 在Windows上更改Qt的计时器分辨率
- 正在寻找高分辨率计时器