- 지정된 개체가 신호를 받은 상태가 되거나 시간 제한 간격이 경과할 때까지 기다림
- 지정된 개체의 현재 상태를 확인 -> 개체의 상태가 신호가 없는 경우 -> 호출 스레드는 개체가 신호를 받거나 시간 제한 간격이 경과할 때까지 대기 상태에 들어감
- 경고 가능한 대기 상태를 입력하려면 WaitForSingleObjectEx 함수를, 여러 객체를 기다리려면 WaitForMultipleObjects 를 사용
Syntax
DWORD WaitForSingleObject(
[in] HANDLE hHandle,
[in] DWORD dwMilliseconds
);
hHandle
개체에 대한 핸들
- 대기가 아직 보류 중인 동안 이 핸들이 닫히면 함수의 동작이 정의되지 않음( 오류가 발생한다는 의미 인 듯. 이 함수를 호출한 부분이나 호출당한 부분에서 행이 걸리거나... )
- 핸들에는 SYNCHRONIZE(동기화) 액세스 권한 필요
- WaitForSingleObject API 끝난 후 CloseHandle( hHandle ); 호출해줘서 핸들 닫기!
dwMilliseconds
타임아웃 시간
- INFINITE 이면 객체가 신호를 받을 때만 함수가 반환
Return
- 실패 시, WAIT_FAILED( (DWORD)0xFFFFFFFF ) 리턴
- 확장된 오류 정보를 얻으려면 GetLastError() 를 호출
- 성공 시
- WAIT_ABANDONED : 지정된 오브젝트는 파기 되어진 뮤텍스 오브젝트 였다. 이 뮤텍스 오브젝트를 소유한 스레드가 뮤텍스 오브젝트의 소유권을 풀어주지 않고 종료했다. 그래서 그 뮤텍스 오브젝트의 소유권이 호출한 쪽 스레드로 옮겨져 그 뮤텍스는 비시그널 상태로 설정되었다.
- 이 경우, ResetEvent( hHandle ) 호출하여 해당 개체에 대한 핸들을 reset 하고 다시 WaitForSingleObject() 호출
- WAIT_OBJECT_0 : Event가 신호(Signal) 상태가 됨( 대표적으로 성공을 리턴했다고 봐야할 듯 )
- WAIT_TIMEOUT : 타임아웃 시간이 경과할 때까지 시그널 생태가 되지 않음.
기타
- CreateEvent(), SetEvent(), ResetEvent() 와 함께 쓰일 수 있는 듯
- CreateProcess() 호출한 후에도 쓰일 수 있음. 아마도
참고