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
TAGS.

Comments