【问题标题】:Changing Qt's timer resolution on Windows在 Windows 上更改 Qt 的计时器分辨率
【发布时间】: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


【解决方案1】:

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

您是否考虑过改用QElapsedTimer?它默认使用 Windows 的高分辨率性能计数器,如果不可用,则回退到精度较低的计时器。

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

【讨论】:

  • 谢谢; QElapsedTimer 分辨率就足够了,但我实际上是使用定时器来触发周期性事件,并且该应用程序旨在处理发布到所有者 QThread 的消息队列的定时器事件。不幸的是,为了尽量减少损坏,我必须创建一个新线程来管理时间并进行一些我想避免的重构(如果我这样做,我还不如只使用 winmm 计时器,所以我不刻录 CPU 循环)。我已经编辑了我的问题,以澄清我正在推动周期性事件而不是测量经过的时间。
  • 我不了解 Qt,但对于 Win7+,这是错误的/已过时的。 A simple test proves that it can go down to 1ms.
【解决方案2】:

来自关于 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 毫秒的类型。

【讨论】:

  • 唉,我使用的是 Qt 4.8,计时器精度似乎是 Qt 5 的新特性。不过,这无疑是升级的一个令人信服的理由;很高兴看到他们解决了这个问题。感谢您指出这一点,我不知道它存在。
  • 接受这个旧答案,因为我很久以前就从 Qt4 升级了,并且 Qt5 有更强大的计时器设施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多