2012-11-07 38 views
1

我並不是指精度達到1毫秒,我在詢問有關使用Sleep(60 * 60 * 1000)延遲一小時的情況。會不會是一個小時,而不是55或70分鐘?線程是否保證喚醒並且不會永遠睡眠?WinAPI的Sleep()有多精確?

+1

您是否考慮過線程可能不是解決當前任務的正確工具的可能性? – asawyer

+0

@asawyer我可以在簡單的C環境中使用什麼? – mrpyo

+1

@mrpyo:你想最終試圖完成什麼?計劃任務,定時器或類似工具可能會更好地滿足您的需求。你的問題讓我想起了[this](http://blogs.msdn.com/b/oldnewthing/archive/2006/03/23/558887.aspx)博客文章(不是說我難以置信地搖頭,但我很好奇你爲什麼要「睡覺」一個小時)。 – user786653

回答

2

超過一個小時,Sleep()調用的準確性並不差,(它也相當容易測試)。 Sleep()調用將返回足夠接近小時的時間,以至於無法用手動秒錶確定任何錯誤(在XP上試用過 - 現在沒有理由與AFAIK有什麼不同)。

錯誤wrt。如果連續調用睡眠(3600 * 1000),掛壁時間當然會累積,特別是如果在每個間隔的末端執行的操作本身冗長和/或盒子嚴重超載(即更多準備好的線程比核心)。

爲什麼線程會永遠睡眠,如果你問它睡一個小時?如果您打電話睡眠(3600 * 1000),那麼在此之後它將準備就緒。如果沒有,操作系統無論如何都會出現故障,並且您正在重新啓動。

這樣的Sleep()調用可能優先於某個定時器的原因是它是單線程的並且可以在調用者堆棧的任何地方工作 - 不需要消息處理程序和/或狀態機來處理定時器回調。

+0

我想要的是一個不是'Sleep()'的計時器。但是這留下了一個問題 - 使用Sleep()本質上是錯誤的?當我有消息泵時,是否應該總是使用'CreateTimerQueueTimer()'(或'SetTimer()')? – mrpyo

+0

@mrpyo - 如果你有一個消息驅動的GUI線程或類似的,那麼是的,使用一個發送WM_TIMER消息的定時器類。您不能在GUI事件處理程序中等待/休眠。在GUI風格的線程中,Sleep()本身是錯誤的,它必須及時處理輸入。 –

+1

+1單線程。否則,等待定時器可能會使'喚醒'更具可預測性(如果正確完成,可以少於1毫秒)。但是,這仍然取決於調度程序是否允許在該時間安排任務或者其他任務是否禁止該任務。 – Arno