Qt的高分辨率定时器(Qt high-resolution timer)

2019-08-18 09:24发布

我正在写一个仿真器使用C ++的系统,使用Qt的UI,事件处理,等等。 很显然,我需要有一个准确的定时参考。 现在,我用适当的间隔QTimer(16.66667毫秒NTSC,20毫秒PAL),但如预期,那精度是可怕的。 有时计时器触发在50 FPS,有时120 FPS。

我意识到,大多数操作系统具有一些功能,以提供准确的时间戳到微(或纳米)的第二级。 (即QueryPerformanceCounter Windows上。)

而不是使用系统时钟的,我也在想同步到音频时钟,因为我已经有一个音频输出流的,但我不认为Qt的为您提供的功能。

什么是最简单的(和/或最佳)的方式同步到一些精确的时钟调用,在正常情况下,在特定的时间间隔的功能,很少有抖动,从C ++ / Qt的?

Answer 1:

高分辨率时间戳并不意味着有当高分辨率时间戳的给定值已经达到,这将唤醒一个沉睡的线程内核中的机制。

在Qt和Windows上,当你的计时器超时是“足够短”(<= 10ms的IIRC),QT将迫使系统的刻度间隔为1毫秒〜(无论是1000赫兹或1024Hz的)。

你需要做的是如下:

  1. 跟踪的使用高分辨率时间QElapsedTimer (内部在Windows上使用性能计数器或任何有给予最高分辨率时)。

  2. 设置基础上的高分辨率时间从#1的值的计时器到期。

当然,你需要处理的是时间太长帧,被错过了定时器等。但是这是唯一明智的方法来得到它的工作。

另外,您也可以使用通知时音频缓冲区已排至一定水平。 Qt的5可以提供原料药。

您可以生成任何操作系统上更好的时机的唯一方法是使用比通用计时器滴答其他专门的硬件。 这样的硬件可以是在环回模式下运行的串行端口一样简单。 它可以是作为附加和独立可等待的事件源是非常有用的。 音频缓冲区交换可以定时的良好来源,太。

如果您想进一步权衡功耗计时准确, 你可以奉献一超线程忙等待,同时轮询高分辨率的时间源 。 这不是轻率地做,但对于某些应用,譬如说测试工具,它可能是确定。 笔记本电脑/笔记本电脑/平板电脑用户会恨你。

一谨防梦幻般的文章 ,在那里,建议,有没有工作机会的解决方案,在没有真正(而不是想象的)网卡“计时器”,将在某种程度上影响插座民调等待。



Answer 2:

QTimer是一个事件循环计时器。 这意味着当即使环是自由地处理事件,它只是提供。 它也可以跳过,如果条件是“正确的”。

据我所知,有Qt中没有确定点火计时器。 你将不得不去与特定于平台的调用。

一个可能的Qt溶液可以是从主GUI线程使用确实计数分离的线程msleepusleep 。 你可以有一个计时器线程睡了一段时间,醒醒,醒醒,做实际工作与信号另一个线程然后继续回去睡觉。 工作线程执行任务的切片然后再打开信号灯等待。

QThread::sleep不依赖于事件循环,并可能有更好的精度。



文章来源: Qt high-resolution timer
标签: qt timer