【问题标题】:More Accurate StopWatch (VB.NET)更准确的秒表 (VB.NET)
【发布时间】:2012-12-16 23:33:29
【问题描述】:

有没有比秒表更准确的“睡眠”方法?或者,有没有办法让秒表类更准确?它不必在 .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。

如果我再运行它,它就会保持这种状态。

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

【问题讨论】:

  • @ChristianSauer:秒表的所有“替代品”(我知道)都在做同样的事情,秒表类的作用是:如果可用,使用 HPET。其中大多数是在 Framework 1.1 中“发明”的,因为 Stopwatch 类仅在 FW 2.0 中出现。秒表类是准确的 - 如果 HPET 可用。如果没有 HPET,那么我不知道有任何替代方案可以产生类似的准确性。

标签: vb.net timer stopwatch


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      currentTime - startTime = elapsedTime

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-18
        • 1970-01-01
        • 2016-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        • 2013-05-05
        相关资源
        最近更新 更多