1

有没有比秒表更准确的“睡眠”方法?或者,有没有办法让秒表类更准确?它不必在 .NET 中,它可以在 c++ 中,但无论使用哪种语言,都必须具有 1 毫秒的准确度;我不需要更多。假设我想让我的程序“休眠”300 毫秒,我希望它至少在大多数时间休眠 300 毫秒。

目前我使用:

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

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

如果我运行更多,它会保持这种状态。

我将我的线程和进程优先级设置为“实时”/“高”。

4

3 回答 3

5

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

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

如何克服:你不能。如前所述:Windoes 不是实时操作系统!即使您将优先级“实时”分配给您的流程。

于 2012-12-17T08:01:16.977 回答
1

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

于 2012-12-16T23:41:07.403 回答
0

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

currentTime - startTime = elapsedTime

...其中currentTimeSystem.DateTime.Now,startTime是计时器启动的时间,并且elapsedTimeSystem.DateTime.TimeSpan.

有关如何执行此操作的更多详细信息,请查看我在 VB.Net 中制作的程序的源代码,E-Tech Timer:http ://etechtimer.codeplex.com

于 2014-12-26T22:44:02.443 回答