睡眠函数 (synchapi.h)

暂停当前线程的执行,直到超时间隔结束。

若要进入可发出警报的等待状态,请使用 SleepEx 函数。

语法

void Sleep(
  [in] DWORD dwMilliseconds
);

参数

[in] dwMilliseconds

暂停执行的时间间隔(以毫秒为单位)。

如果值为 0,则线程会将其时间切片的剩余部分放弃给已准备好运行的任何其他线程。 如果没有其他线程可供运行,该函数将立即返回,并且线程继续执行。 Windowsxp: 如果值为零,则线程会将其时间切片的剩余部分放弃给已准备好运行的任何其他优先级相等的线程。 如果没有其他优先级相等的线程可供运行,该函数将立即返回,并且线程继续执行。 从 Windows Server 2003 开始,此行为已更改。

INFINITE 值指示暂停不应超时。

返回值

备注

此函数会导致线程放弃其时间切片的剩余部分,并且根据 dwMilliseconds 的值在某个时间间隔内变得不可运行。 系统时钟以恒定的速率“滴答声”。 如果 dwMilliseconds 小于系统时钟的分辨率,则线程的睡眠时间可能小于指定的时间长度。 如果 dwMilliseconds 大于一个刻度,但小于 2,则等待时间可以是介于 1 和 2 个刻度之间的任意位置,依此而论。 若要提高睡眠间隔的准确性,请调用 timeGetDevCaps 函数来确定受支持的最小计时器分辨率,并调用 timeBeginPeriod 函数将计时器分辨率设置为其最小值。 调用 timeBeginPeriod 时请谨慎,因为频繁调用可能会显著影响系统时钟、系统电源使用情况和计划程序。 如果调用 timeBeginPeriod,请在应用程序的早期调用一次,并确保在应用程序末尾调用 timeEndPeriod 函数。

经过睡眠间隔后,线程即可运行。 如果指定 0 毫秒,线程将放弃其时间段的剩余时间,但仍保持就绪状态。 请注意,不保证就绪线程立即运行。 因此,线程可能在睡眠间隔过后一段时间后才运行。 有关详细信息,请参阅 计划优先级

在以下情况下使用 睡眠 时要小心:

  • 直接或间接创建窗口的代码 (例如 DDE 和 COM CoInitialize) 。 如果线程创建任何窗口,则必须处理消息。 消息广播将发送到系统中的所有窗口。 如果有一个线程使用具有无限延迟的 睡眠 ,则系统将死锁。
  • 受并发控制的线程。 例如,I/O 完成端口或线程池会限制可以运行的关联线程数。 如果已运行的最大线程数,则在运行线程完成之前,无法运行其他关联的线程。 如果线程使用间隔为零的 睡眠 来等待一个附加的关联线程完成某些工作,则进程可能会死锁。
对于这些方案,请使用 MsgWaitForMultipleObjectsMsgWaitForMultipleObjectsEx,而不是 Sleep

Windows Phone 8.1:Windows Phone 8.1 及更高版本上的 Windows Phone 应用商店应用支持此函数。

Windows 8.1Windows Server 2012 R2:Windows 8.1、Windows Server 2012 R2 及更高版本的 Windows 应用商店应用支持此函数。

示例

有关示例,请参阅 使用线程本地存储

要求

要求
最低受支持的客户端 Windows XP [桌面应用 | UWP 应用]
最低受支持的服务器 Windows Server 2003 [桌面应用 | UWP 应用]
目标平台 Windows
标头 synchapi.h (包括 Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2)
Library Kernel32.lib;Windows Phone 8.1 上的 WindowsPhoneCore.lib
DLL Kernel32.dll;Windows Phone 8.1 上的 KernelBase.dll

另请参阅

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

进程和线程函数

SleepEx

挂起线程执行

线程

WaitOnAddress