有没有比秒表准确的“睡眠”方法?或者,有没有办法让秒表课更准确?它不一定是在.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。
如果我再跑一次,那就好了。
我把我的线程和进程优先级放在“实时”/“高”上。
答案 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
...其中currentTime
为System.DateTime.Now
,startTime
是计时器启动的时间,elapsedTime
是System.DateTime.TimeSpan
。
有关如何执行此操作的更多详细信息,请查看我在VB.Net,E-Tech计时器中创建的程序的来源:http://etechtimer.codeplex.com