sleepEx 函数 (synchapi.h)

挂起当前线程,直到满足指定的条件。 发生以下情况之一时,将继续执行:

  • 调用 I/O 完成回调函数。
  • 异步过程调用 (APC) 排队到线程。
  • 超时间隔已过。

语法

DWORD SleepEx(
  [in] DWORD dwMilliseconds,
  [in] BOOL  bAlertable
);

参数

[in] dwMilliseconds

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

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

INFINITE 值指示暂停不应超时。

[in] bAlertable

如果此参数为 FALSE,则函数在超时期限过后才会返回。 如果发生 I/O 完成回调,该函数不会立即返回,并且不会执行 I/O 完成函数。 如果 APC 已排队到线程,该函数不会立即返回,并且不会执行 APC 函数。

如果 参数为 TRUE,并且调用此函数的线程与调用扩展 I/O 函数 (ReadFileExWriteFileEx) 的线程相同,则当超时期限已过或发生 I/O 完成回调函数时,函数将返回 。 如果发生 I/O 完成回调,则调用 I/O 完成函数。 如果将 APC 排队到 queueUserAPC) (线程,则当超时期限已过或调用 APC 函数时,函数将返回 。

返回值

如果指定的时间间隔过期,则返回值为零。

如果函数由于一个或多个 I/O 完成回调函数而返回,则返回值WAIT_IO_COMPLETION。 仅当 bAlertable 为 TRUE,并且调用 SleepEx 函数的线程与调用扩展 I/O 函数的线程相同时,才会发生这种情况。

注解

此函数会导致线程放弃其时间切片的剩余部分,并且根据 dwMilliseconds 的值在某个时间间隔内变得不可运行。 经过睡眠间隔后,线程即可运行。 请注意,不保证就绪线程立即运行。 因此,根据系统“滴答”频率和其他进程的负载系数,在睡眠间隔过后的某个任意时间后,线程才会运行。 系统时钟以恒定的速率“滴答声”。 若要提高睡眠间隔的准确性,请调用 timeGetDevCaps 函数来确定受支持的最小计时器分辨率,并调用 timeBeginPeriod 函数将计时器分辨率设置为其最小值。 调用 timeBeginPeriod 时请谨慎,因为频繁调用可能会显著影响系统时钟、系统电源使用情况和计划程序。 如果调用 timeBeginPeriod,请在应用程序的早期调用一次,并确保在应用程序末尾调用 timeEndPeriod 函数。 如果指定 0 毫秒,线程将放弃其时间段的剩余时间,但仍保持就绪状态。 有关详细信息,请参阅 计划优先级

此函数可以与 ReadFileExWriteFileEx 函数一起使用,以挂起线程,直到完成 I/O 操作。 这些函数指定完成 I/O 操作时要执行的完成例程。 对于要执行的完成例程,当完成回调函数发生时,调用 I/O 函数的线程必须处于可警报等待状态。 线程通过调用 SleepExMsgWaitForMultipleObjectsExWaitForSingleObjectExWaitForMultipleObjectsEx 进入可警报等待状态,并将函数的 bAlertable 参数设置为 TRUE。

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

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

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 Windows Phone 8.1 上的 KernelBase.dll;Kernel32.dll

另请参阅

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

进程和线程函数

QueueUserAPC

ReadFileEx

休眠

挂起线程执行

线程

WaitForMultipleObjectsEx

WaitForSingleObjectEx

WaitOnAddress

WriteFileEx