我需要一个准确的计时器来将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毫秒)。这可能是我需要的。如果有一种产品,可能还有其他产品。
再次感谢。
答案 0 :(得分:4)
您需要使用high resolution timer,例如QueryPerformanceCounter
答案 1 :(得分:4)
在表面上,答案就像“高分辨率计时器”,但这是不正确的。答案需要定期生成滴答,并且windows高分辨率性能计数器API不会生成这样的滴答。
我知道这不是自己的答案,但到目前为止对这个问题的流行答案是错误的,我觉得对它的简单评论是不够的。
答案 2 :(得分:2)
在System.Diagnostics中,您可以使用Stopwatch类。
答案 3 :(得分:2)
系统心跳给出了限制。这通常默认为64次/秒,即15.625毫秒。但是,有一些方法可以修改这些系统范围的设置,以便在较新的平台上实现低至1毫秒甚至0.5毫秒的定时器分辨率:
通过多媒体计时器界面(timeBeginPeriod()
)获得1 ms分辨率:
通过NtSetTimerResolution()
:
您可以通过隐藏的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。