WaitForSingleObject
DWORD WaitForSingleObject(
HANDLE hHandle, // handle to object
DWORD dwMilliseconds // time-out interval
);
실패시 WAIT_FAILED 리턴
HhANDLE : 상태를 확인할 커널 오브젝트의 핸들을 전달.
이 핸들의 커널 오브젝트 상태가 signaled가 되어야 리턴한다.
non-signaled상태에 있을 경우 함수는 리턴하지 않고 대기상태로 들어간다.
dwMilliseconds : 타임아웃을 설정한다. 커널오브젝트가 singnaled 상태로 바뀌지 않을 경우 무한대기 상태로 빠질수 있다.
그러나 타임아웃을 설정해 놓으면 그 시간이 지나서 바로 리턴하게 된다.
1/1000초 단위로 설정한다. 만약 INFINITE를 전달할 경우 signaled 상태가 되기 전에는 리턴하지 않는다.
return value : 커널 오브젝트가 이벤트 발생으로 인해, signaled 상태가 되어 리턴하는 경우에는
WAIT_OBJECT_O를 리턴한다. 만약에 타임아웃이 되어서 리턴하는 경우에는 WAIT_TIMEOUT을 리턴한다.
성공적으로 함수를 리턴하는 경우(이벤트 발생에 의해, 커널 오브젝트가 SIGNALED 상태가 되어 리턴하는 경우)
커널 오브젝트를 non-signaled 상태로 되돌린다. (이는 auto-reset일 경우만 해당)
이 함수는 스레드의 종료를 지연시키는 목적으로 사용될 수 있다.
그리고 스레드의 동기화에서도 상당히 유용하게 사용된다.
main thread 종료를 지연시키는 예제.
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>
unsigned WINAPI ThreadFunction(void* arg);
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread;
DWORD dwThreadID;
DWORD dw;
// thread를 생성.
hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadFunction, NULL, 0, (unsigned*)&dwThreadID);
if(hThread == 0)
{
puts("_beginthreadex() error");
exit(1);
}
printf("생성된 스레드의 핸들 : %d\n", hThread);
printf("생성된 스레드의 ID : %d\n", dwThreadID);
Sleep(3000);
// hThread의 스레드가 완료될 때까지 대기시킨다.
dw = WaitForSingleObject(hThread, INFINITE);
if(dw == WAIT_FAILED)
{
puts("스레드 wait 오류");
exit(1);
}
printf("main 함수 종료, %s 종료\n", dw == WAIT_OBJECT_0 ?"정상" : "비정상");
getchar();
return 0;
}
unsigned WINAPI ThreadFunction(void* arg)
{
// main thread 이외의 thread. beginthreadex로 생성.
int i;
for(i=0; i<5; i++)
{
Sleep(2000);
puts("스레드 실행 중");
}
return 0;
}
참고 : TCP/IP 소켓 프로그래밍 433p
6년만에 다시 이 책을 펴게 되는군..허허허...ㅡㅡ;;;.
모자른 기초에 부끄러워하지 말고 더욱 다질수 있게 된 것에 대해 다행이라 생각하자..
'Study > Network' 카테고리의 다른 글
CreateEvent (0) | 2010.10.31 |
---|---|
_beginthreadex (2) | 2010.10.30 |