首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更精确的StopWatch (VB.NET)

更精确的StopWatch (VB.NET)
EN

Stack Overflow用户
提问于 2012-12-17 07:33:29
回答 3查看 4.3K关注 0票数 1

有没有比秒表更准确的“睡眠”方法?或者,有没有办法让秒表类更准确?它不一定要用.NET写,也可以用c++写,但不管用哪种语言写的,精度都必须是1ms;我不需要更多。比方说,如果我想让我的程序“休眠”300ms,我希望它至少在大部分时间里休眠300ms。

目前我使用的是:

代码语言:javascript
运行
复制
Dim StopWatch As New StopWatch
StopWatch.Start
Do
Loop Until StopWatch.ELapsed.Milliseconds >= 300
StopWatch.Stop

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

如果我更多地运行它,它就会保持原样。

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

EN

回答 3

Stack Overflow用户

发布于 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不是实时操作系统!即使你给你的进程分配了“实时”的优先级。

票数 5
EN

Stack Overflow用户

发布于 2012-12-17 07:41:07

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-27 06:44:02

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

currentTime - startTime = elapsedTime

...where currentTimeSystem.DateTime.NowstartTime为计时器启动时间,elapsedTimeSystem.DateTime.TimeSpan

有关如何做到这一点的更多详细信息,请查看我用VB.Net制作的E-Tech Timer:http://etechtimer.codeplex.com程序的源代码

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13906558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档