簡體   English   中英

睡眠()或睡眠()有多准確

[英]How accurate is Sleep() or sleep()

我正在嘗試模擬按鍵和按鍵動作。

例如:2638毫秒。

SendMessage(hWnd, WM_KEYDOWN, keyCode, 0);
Sleep(2638);
SendMessage(hWnd, WM_KEYUP, keyCode, 0);

你怎么知道它真的有用嗎?

您不會使用此代碼,因為准確測量代碼執行所需的時間是一項艱巨的任務。

要了解您的問題標題提出的問題(您應該一次提出一個問題......)所述功能的准確性由操作系統決定。 在Linux上,系統時鍾粒度為10ms,因此通過nanosleep()的定時進程暫停僅保證精確到10ms,即使這樣,也不能保證在指定的時間內完全休眠。 (見下文。)

在Windows上,可以更改時鍾粒度以適應電源管理需求(例如,降低粒度以節省電池電量)。 有關Sleep功能,請參閱MSDN的文檔

請注意,對於Sleep()/ nanosleep(),操作系統僅保證進程暫停將至少持續您指定的時間。 執行其他進程總是可以延遲恢復進程。

因此,上面的代碼發送的按鍵事件將比按鍵事件發送至少2.638秒,而不是更快的毫秒。 但事件有可能在2.7秒,2.8秒甚至3秒后發送。 (或者,如果實時進程占用了CPU並且在一段時間內沒有放棄控制,那么很久以后。)

Sleep在標准Windows線程調度方面起作用。 它精確到大約20-50毫秒。

因此,對於依賴於用戶體驗的事物來說,它是可以的。 然而,這對於實時事物來說絕對不合適。

除此之外,還有更好的方法來模擬鍵盤/鼠標事件。 請參閱SendInput

當請求的延遲比下一次中斷發生的剩余時間短時,sleep()函數將在所需的延遲之前返回。 但這僅指出您希望睡眠時間比系統支持的當前時間短。 建議將多媒體定時器資源設置為更高的中斷頻率,以獲得觀察到的睡眠延遲與所需延遲的更好匹配。

以下主題中的注釋:

如何在WinXP下獲得准確的1ms計時器滴答

睡眠不到一毫秒

命令Sleep()將確保線程至少暫停作為參數給出的時間量。 操作系統不保證。 有關詳細討論,您可以參考以下文章如何在操作系統級別實現睡眠?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM