睡眠函式 (synchapi.h)

暫停目前線程的執行,直到逾時間隔經過為止。

若要進入可警示的等候狀態,請使用 SleepEx 函 式。

語法

VOID Sleep(
  [in] DWORD dwMilliseconds
);

參數

[in] dwMilliseconds

要暫停執行的時間間隔,以毫秒為單位。

值為零會導致線程將其時間配量其餘部分放棄給任何其他準備好執行的線程。 如果沒有其他線程可供執行,函式會立即傳回,而線程會繼續執行。 Windowsxp: 值為零會導致線程將其時間配量其餘部分放棄為任何其他已準備好執行之優先順序相同的線程。 如果沒有其他優先順序相等的線程可供執行,函式會立即傳回,而且線程會繼續執行。 此行為從 Windows Server 2003 開始變更。

INFINITE 的值表示暫停不應逾時。

傳回值

無

備註

此函式會使線程放棄其時間配量的其餘部分,並根據 dwMilliseconds 的值,在間隔內變成無法執行。 系統時鐘會以固定速率「刻度」。 如果 dwMilliseconds 小於系統時鐘的解析度,線程可能會睡眠時間小於指定的時間長度。 如果 dwMilliseconds 大於一個刻度,但小於兩個,則等候可以是介於一到兩個刻度之間的任意位置,依此類提。 若要增加睡眠間隔的精確度,請呼叫 timeGetDevCaps 函式來判斷支援的最小定時器解析度和 timeBeginPeriod 函式,將定時器解析度設定為其最小值。 呼叫 timeBeginPeriod 時請小心,因為頻繁的呼叫可能會大幅影響系統時鐘、系統電源使用量和排程器。 如果您呼叫 timeBeginPeriod,請在應用程式中提早呼叫它一次,並確定在應用程式結尾呼叫 timeEndPeriod 函式。

進入睡眠間隔之後,線程便已準備好執行。 如果您指定 0 毫秒,線程將會放棄其時間配量的其餘部分,但仍保持就緒狀態。 請注意,就緒的線程不保證會立即執行。 因此,在睡眠間隔經過一段時間之後,線程可能不會執行。 如需詳細資訊,請參閱 排程優先順序。

在下列案例中使用 睡眠 時請小心:

  • 直接或間接建立 windows (的程式代碼,例如 DDE 和 COM CoInitialize) 。 如果線程建立任何視窗,它就必須處理訊息。 訊息廣播會傳送至系統中的所有視窗。 如果您有一個使用 Sleep 且具有無限延遲的線程,系統將會死結。
  • 在並行控制下的線程。 例如,I/O 完成埠或線程集區會限制可執行的相關線程數目。 如果線程數目上限已在執行中,則在執行中的線程完成之前,無法執行其他相關聯的線程。 如果線程使用 Sleep 的間隔為零,等待其中一個額外的相關聯線程完成某些工作,進程可能會死結。
在這些案例中,請使用 MsgWaitForMultipleObjects 或 MsgWaitForMultipleObjectsEx,而不是 Sleep。

Windows Phone 8.1:Windows Phone Windows Phone 8.1 和更新版本上的市集應用程式支援此函式。

Windows 8.1和 Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 和更新版本上的 Windows 市集應用程式支援此函式。

範例

如需範例,請參閱 使用線程本機記憶體。

規格需求

需求 值
最低支援的用戶端 Windows XP [傳統型應用程式 |UWP 應用程式]
最低支援的伺服器 Windows Server 2003 [傳統型應用程式 |UWP 應用程式]
目標平台 Windows
標頭 synchapi.h (包括 Windows Vista 上的 Windows.h、Windows 7、Windows Server 2008 Windows Server 2008 R2)
程式庫 Kernel32.lib;Windows Phone 8.1 上的 WindowsPhoneCore.lib
Dll Kernel32.dll;Windows Phone 8.1 上的 KernelBase.dll

另請參閱

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

處理序和執行緒函式

SleepEx

暫停線程執行

執行緒

WaitOnAddress