更准确的秒表(VB.NET)

时间:2012-12-16 23:33:29

标签: vb.net timer stopwatch

有没有比秒表准确的“睡眠”方法?或者,有没有办法让秒表课更准确?它不一定是在.NET中,它可以是c ++,但无论用什么语言都必须精确到1ms;我不需要更多。如果我希望我的程序“睡眠”300毫秒,我希望它至少在大部分时间内睡眠300毫秒。

目前我使用:

Dim StopWatch As New StopWatch
StopWatch.Start
Do
Loop Until StopWatch.ELapsed.Milliseconds >= 300
StopWatch.Stop

我运行5次的结果是:306,305,315,327,304。

如果我再跑一次,那就好了。

我把我的线程和进程优先级放在“实时”/“高”上。

3 个答案:

答案 0 :(得分:4)

Stopwatch类有一个属性IsHighResolution。如果它返回'true',则表示您正在使用高性能事件计时器(HPET) - 可用性取决于硬件和操作系统。使用此功能,您可以非常准确地测量时间。但! Windows(和通常的Linux一样)不是实时操作系统,而是使用抢占式多任务处理。每当操作系统认为它需要时,它将使您当前的线程on hold执行其他工作,一段时间后,它会return到您的线程并让它继续。如果此switch发生在您的循环内某处,您仍然会测量正确的时间,但它包含inactivty时间。

由于Windows下的time slice介于15到30毫秒之间,因此您(r线程)可能在299毫秒后被暂停,15-30毫秒后您将返回。这就是你看到的效果。秒表是准确的。它只是测量你没想到的东西。

如何克服:你做不到。如上所述:Windoes不是实时操作系统!即使您为流程指定了“实时”优先级。

答案 1 :(得分:1)

你所看到的是完全正常的。延迟永远不会是300毫秒,它永远不会超过300毫秒。睡眠本身是准确的,但实际的延迟取决于您的操作系统,以及与您并行运行的其他进程。

答案 2 :(得分:0)

如果您想要更准确的计时器,则需要使用当前日期和时间作为参考。这是一个简单的等式,你可以每毫秒运行一次:

currentTime - startTime = elapsedTime

...其中currentTimeSystem.DateTime.NowstartTime是计时器启动的时间,elapsedTimeSystem.DateTime.TimeSpan

有关如何执行此操作的更多详细信息,请查看我在VB.Net,E-Tech计时器中创建的程序的来源:http://etechtimer.codeplex.com