有没有比秒表更准确的“睡眠”方法?或者,有没有办法让秒表类更准确?它不一定要用.NET写,也可以用c++写,但不管用哪种语言写的,精度都必须是1ms;我不需要更多。比方说,如果我想让我的程序“休眠”300ms,我希望它至少在大部分时间里休眠300ms。
目前我使用的是:
Dim StopWatch As New StopWatch
StopWatch.Start
Do
Loop Until StopWatch.ELapsed.Milliseconds >= 300
StopWatch.Stop我运行它5次的结果是: 306,305,315,327,304。
如果我更多地运行它,它就会保持原样。
我将我的线程和进程优先级设置为“实时”/“高”。
发布于 2012-12-17 16:01:17
秒表类有一个属性IsHighResolution。如果返回“true”,则表示您正在使用高性能事件定时器 (HPET) -可用性取决于硬件和操作系统。使用它,您可以非常精确地测量时间。但!Windows (和往常一样)不是实时操作系统,而是使用抢占式多任务处理。每当操作系统认为它需要的时候,它就会让你当前的线程去做其他工作,一段时间后,它会return到你的线程,让它继续。如果此switch发生在您的循环中的某个地方,您仍然可以测量正确的时间,但它包含一定数量的inactivty时间。
因为Windows下的线程是在15到30 ms之间,所以你(r time slice )可能会在299 ms之后被挂起,15-30 ms后你会回来。这就是你所看到的效果。秒表是准确的。它只是测量你意想不到的东西。
如何克服:你不能。如上所述: Windoes不是实时操作系统!即使你给你的进程分配了“实时”的优先级。
发布于 2012-12-17 07:41:07
你所看到的是完全正常的。延迟永远不会精确到300ms,它总是会超过300ms。睡眠本身是准确的,但实际延迟取决于您的操作系统,以及与您的操作系统并行运行的其他进程。
发布于 2014-12-27 06:44:02
如果您需要更精确的计时器,则需要使用当前日期和时间作为参考。这是一个简单的方程式,你可以每毫秒运行一次:
currentTime - startTime = elapsedTime
...where currentTime为System.DateTime.Now,startTime为计时器启动时间,elapsedTime为System.DateTime.TimeSpan。
有关如何做到这一点的更多详细信息,请查看我用VB.Net制作的E-Tech Timer:http://etechtimer.codeplex.com程序的源代码
https://stackoverflow.com/questions/13906558
复制相似问题