SleepEx 함수(synchapi.h)

지정된 조건이 충족될 때까지 현재 스레드를 일시 중단합니다. 다음 중 하나가 발생하면 실행이 다시 시작됩니다.

  • I/O 완성 콜백 함수가 호출됩니다.
  • APC(비동기 프로시저 호출)가 스레드에 큐에 대기됩니다.
  • 제한 시간 간격이 경과합니다.

구문

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

매개 변수

[in] dwMilliseconds

실행이 일시 중단될 시간 간격(밀리초)입니다.

값이 0이면 스레드가 해당 시간 조각의 나머지 부분을 실행할 준비가 된 다른 스레드로 포기하게 됩니다. 실행할 준비가 된 다른 스레드가 없으면 함수는 즉시 반환되고 스레드는 계속 실행됩니다. Windows XP: 값이 0이면 스레드가 해당 시간 조각의 나머지 부분을 실행할 준비가 된 동일한 우선 순위의 다른 스레드로 포기하게 됩니다. 동일한 우선 순위의 다른 스레드를 실행할 준비가 되지 않은 경우 함수는 즉시 반환되고 스레드는 실행을 계속합니다. 이 동작은 Windows Server 2003부터 변경되었습니다.

INFINITE 값은 일시 중단 시간이 초과되어서는 안 됨을 나타냅니다.

[in] bAlertable

이 매개 변수가 FALSE이면 제한 시간이 경과할 때까지 함수가 반환되지 않습니다. I/O 완료 콜백이 발생하면 함수가 즉시 반환되지 않고 I/O 완료 함수가 실행되지 않습니다. APC가 스레드에 큐에 대기하는 경우 함수는 즉시 반환되지 않고 APC 함수가 실행되지 않습니다.

매개 변수가 TRUE이고 이 함수를 호출한 스레드가 확장 I/O 함수(ReadFileEx 또는 WriteFileEx)를 호출한 스레드와 동일한 경우 이 함수는 제한 시간이 경과하거나 I/O 완료 콜백 함수가 발생할 때 를 반환합니다. I/O 완료 콜백이 발생하면 I/O 완성 함수가 호출됩니다. APC가 스레드(QueueUserAPC)에 큐에 대기 중인 경우 제한 시간이 경과하거나 APC 함수가 호출될 때 함수가 반환됩니다.

반환 값

지정된 시간 간격이 만료된 경우 반환 값은 0입니다.

하나 이상의 I/O 완료 콜백 함수로 인해 함수가 반환되는 경우 반환 값은 WAIT_IO_COMPLETION . bAlertable이 TRUE이고 SleepEx 함수를 호출한 스레드가 확장 I/O 함수를 호출한 스레드와 동일한 경우에만 발생할 수 있습니다.

설명

이 함수를 사용하면 스레드가 나머지 시간 조각을 포기하고 dwMilliseconds 값에 따라 간격을 실행할 수 없게 됩니다. 절전 모드 간격이 지나면 스레드를 실행할 준비가 된 것입니다. 준비 스레드는 즉시 실행되도록 보장되지 않습니다. 따라서 스레드는 시스템 "틱" 빈도 및 다른 프로세스의 부하 요인에 따라 절전 간격이 경과한 후 임의의 시간까지 실행되지 않습니다. 시스템 클록은 일정한 속도로 "틱"합니다. 절전 모드 간격의 정확도를 높이려면 timeGetDevCaps 함수를 호출하여 지원되는 최소 타이머 해상도와 timeBeginPeriod 함수를 확인하여 타이머 해상도를 최소값으로 설정합니다. timeBeginPeriod를 호출할 때는 잦은 호출이 시스템 클록, 시스템 전원 사용량 및 스케줄러에 큰 영향을 줄 수 있으므로 주의해야 합니다. timeBeginPeriod를 호출하는 경우 애플리케이션에서 일찍 한 번 호출하고 애플리케이션의 맨 끝에 timeEndPeriod 함수를 호출해야 합니다. 0밀리초를 지정하는 경우 스레드는 나머지 시간 조각을 포기하지만 준비 상태를 유지합니다. 자세한 내용은 예약 우선 순위를 참조하세요.

이 함수는 ReadFileEx 또는 WriteFileEx 함수와 함께 사용하여 I/O 작업이 완료될 때까지 스레드를 일시 중단할 수 있습니다. 이러한 함수는 I/O 작업이 완료될 때 실행할 완료 루틴을 지정합니다. 완료 루틴을 실행하려면 완료 콜백 함수가 발생할 때 I/O 함수를 호출한 스레드가 경고 가능한 대기 상태여야 합니다. 스레드는 함수의 bAlertable 매개 변수가 TRUE로 설정된 SleepEx, MsgWaitForMultipleObjectsEx, WaitForSingleObjectEx 또는 WaitForMultipleObjectsEx 중 하나를 호출하여 경고 가능한 대기 상태로 전환됩니다.

다음 시나리오에서 SleepEx 를 사용할 때는 주의해야 합니다.

  • 직접 또는 간접적으로 창을 만드는 코드(예: DDE 및 COM CoInitialize). 스레드가 창을 만드는 경우 메시지를 처리해야 합니다. 메시지 브로드캐스트는 시스템의 모든 창으로 전송됩니다. 무한 지연으로 SleepEx 를 사용하는 스레드가 있는 경우 시스템이 교착 상태가 됩니다.
  • 동시성 제어를 받고 있는 스레드입니다. 예를 들어 I/O 완료 포트 또는 스레드 풀은 실행할 수 있는 연결된 스레드 수를 제한합니다. 최대 스레드 수가 이미 실행 중인 경우 실행 중인 스레드가 완료될 때까지 연결된 추가 스레드를 실행할 수 없습니다. 스레드가 간격이 0인 SleepEx 를 사용하여 연결된 추가 스레드 중 하나가 일부 작업을 수행할 때까지 기다리는 경우 프로세스가 교착 상태에 빠질 수 있습니다.
이러한 시나리오의 경우 SleepEx 대신 MsgWaitForMultipleObjects 또는 MsgWaitForMultipleObjectsEx를 사용합니다.

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의 Windows.h 포함)
라이브러리 Kernel32.lib; Windows Phone 8.1의 WindowsPhoneCore.lib
DLL Windows Phone 8.1의 KernelBase.dll; Kernel32.dll

추가 정보

MsgWaitForMultipleObjects

MsgWaitForMultipleObjectsEx

프로세스 및 스레드 함수

QueueUserAPC

ReadFileEx

Sleep

스레드 실행 일시 중단

스레드

WaitForMultipleObjectsEx

WaitForSingleObjectEx

WaitOnAddress

WriteFileEx