2012-12-16 77 views
1

有沒有比秒錶更精確的「睡眠」方法?或者,有沒有辦法讓秒錶類更準確?它不一定要在.NET中,它可以用C++語言編寫,但無論它使用何種語言,都必須精確到1ms;我不需要那麼多。假如我想讓我的程序「睡」300ms,我希望它至少在大部分時間內能夠睡300ms。更準確的秒錶(VB.NET)

目前我使用:

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

我的結果運行5次分別爲:306,305,315,327,304

它留樣,如果我跑更多。

我把我的線程和進程優先級設置爲「實時」/「高」。

+0

我記得曾讀到一個alternatie在秒錶:HTTP:// www.amazon.de/Microsoft-Visual-Basic-2010-Entwicklerbuch/dp/3866455356/ref=sr_1_2?ie=UTF8&qid=1355735382&sr=8-2 你也可以嘗試:http://www.drewnoakes.com/code /util/StopWatches.html –

+0

@ChristianSauer:Stopwatch的所有「替代品」(我知道)都是這樣做的,Stopwatch類所做的是:使用HPET(如果可用)。他們中的大多數在Framework 1.1中「發明」,因爲Stopwatch課程僅在FW 2.0中提供。秒錶類是準確的 - 如果HPET可用。如果沒有HPET,那麼我不知道任何可以產生相似準確度的替代方案。 – igrimpe

回答

1

你所看到的是完全正常的。延遲永遠不會是300毫秒,它總是會超過300毫秒。睡眠本身是準確的,但實際的延遲取決於您的操作系統以及與您並行運行的其他進程。

4

秒錶類有一個屬性IsHighResolution。如果返回'true',那麼您正在使用高性能事件計時器(HPET) - 可用性取決於硬件和操作系統。使用這個,你可以測量非常準確的時間。但! Windows(通常的Linux)不是實時操作系統,但使用搶先式多任務處理。只要操作系統認爲需要,它會將當前線程on hold做其他工作,並在一段時間後,它將return到您的線程,並讓它繼續。如果這個switch發生在你的循環中的某個地方,你仍然測量正確的時間,但它包含的時間量爲inactivty

由於Windows下的time slice大約在15到30毫秒之間,因此您(r線程)可能會在299毫秒和15-30毫秒後暫停,您將返回。這就是你看到的效果。秒錶是準確的。它只是衡量你沒有想到的東西。

如何克服:你不能。如上所述:Windoes不是實時操作系統!即使您將「實時」優先級分配給您的流程。

0

如果您想要更準確的計時器,則需要使用當前日期和時間作爲參考。這裏有一個簡單的公式,你可以運行每毫秒:

currentTime - startTime = elapsedTime

...其中currentTimeSystem.DateTime.NowstartTime是時間定時器啓動,並elapsedTimeSystem.DateTime.TimeSpan

有關如何做到這一點,檢查出一個節目,我在VB.Net做的來源,E-技術定時器更多的細節:http://etechtimer.codeplex.com