准确的Windows计时器? System.Timers.Timer()限制为15毫秒

时间:2009-01-15 22:33:20

标签: vb.net

我需要一个准确的计时器来将Windows应用程序连接到一个实验室设备。

我使用System.Timers.Timer()来创建一个每10毫秒滴答一次的计时器,但这个时钟运行缓慢。例如,间隔为10毫秒的1000个刻度应该需要10个挂钟秒,但实际上需要20个挂钟(在我的电脑上)。我猜这是因为System.Timers.Timer()是一个间隔计时器,每次经过时都会重置。由于在定时器过去和重置之间(另一个10毫秒)之间总是需要一些时间,因此时钟将运行缓慢。如果间隔很大(几秒或几分钟),这可能很好,但在非常短的间隔内是不可接受的。

Windows上是否有一个函数会在每次系统时钟跨越10毫秒(或其他)边界时触发一个过程?

这是一个简单的控制台应用程序。

由于

范数

更新:对于小间隔,System.Timers.Timer()非常不准确。

我写了一个简单的程序,以几种方式计算10秒:

间隔= 1,计数= 10000,运行时间= 160秒,每间隔msec = 16

间隔= 10,计数= 1000,运行时间= 16秒,每间隔msec = 15

间隔= 100,计数= 100,运行时间= 11秒,每间隔msec = 110

间隔= 1000,计数= 10,运行时间= 10秒,每间隔msec = 1000

似乎System.Timers.Timer()无法在大约15毫秒内更快地打勾 区间设置。

请注意,这些测试似乎都没有使用任何可测量的CPU时间,因此限制不是CPU,只是.net限制(错误?)

现在我认为我可以使用一个不准确的计时器,每15毫秒左右触发一次程序,并且程序获得准确的系统时间。有点奇怪,但是......

我还发现了一个共享软件产品ZylTimer.NET,它声称是一个更精确的.net计时器(分辨率为1-2毫秒)。这可能是我需要的。如果有一种产品,可能还有其他产品。

再次感谢。

6 个答案:

答案 0 :(得分:4)

您需要使用high resolution timer,例如QueryPerformanceCounter

答案 1 :(得分:4)

在表面上,答案就像“高分辨率计时器”,但这是不正确的。答案需要定期生成滴答,并且windows高分辨率性能计数器API不会生成这样的滴答。

我知道这不是自己的答案,但到目前为止对这个问题的流行答案是错误的,我觉得对它的简单评论是不够的。

答案 2 :(得分:2)

在System.Diagnostics中,您可以使用Stopwatch类。

答案 3 :(得分:2)

系统心跳给出了限制。这通常默认为64次/秒,即15.625毫秒。但是,有一些方法可以修改这些系统范围的设置,以便在较新的平台上实现低至1毫秒甚至0.5毫秒的定时器分辨率:

  1. 通过多媒体计时器界面(timeBeginPeriod())获得1 ms分辨率:

    请参阅Obtaining and Setting Timer Resolution

  2. 通过NtSetTimerResolution()

    获得0.5 ms的分辨率

    请参阅Inside Windows NT High Resolution Timers

  3. 可以通过隐藏的API NtSetTimerResolution()获得0.5 ms 分辨率。

    我已经在this回答了所有细节。

答案 4 :(得分:1)

在我的头顶,我可以建议运行一个主要睡觉的线程,但是当它醒来时,它会检查正在运行的QueryPerformanceCounter并偶尔触发你的程序。

答案 5 :(得分:1)

在MSDN上写了一篇很好的文章:Implement a Continuously Updating, High-Resolution Time Provider for Windows

这是文章(C ++)的sample source code