CreateEvent() 사용하기

MFC 2012. 2. 2. 10:59

공부는 역시 상황에 쫓겨서 하는게 가장 효과적이라는.. (..응? 좀 미리 미리 해놓지!!!!)

CreateEvent
(Microsoft Windows CE 3.0)

The CreateEvent function creates a named or an unnamed event object. : 이벤트를 만드는 함수랍니다.

HANDLE CreateEvent( 
  LPSECURITY_ATTRIBUTES lpEventAttributes, 
  BOOL bManualReset, 
  BOOL bInitialState, 
  LPTSTR lpName); 

Parameters

lpEventAttributes : Ignored. Must be NULL. 무시하라는데여.
bManualReset : a manual-reset 이냐 auto-reset event object 이냐를 결정한답니다.
bInitialState : 이벤트 obj의 초기 상태를 결정. 그니까 FALSE를 해야 만들었다가 나중에 set signal 하죠.
lpName : 이벤트 이름
Return 값 : 핸들값이 나옵니다.

그럼 이 함수의 용도와 용법을 알아보면..

CreateEvent(), SetEvnet(), ResetEvent()

1. 함수의 용도

WaitForSingleObject(), WaitForMultipleObjects() 등을 위한 Event Object를 만들고, 그것을 signal 상태 혹은 nonsignal 상태로 만들기 위해 사용됩니다.

2. 기본 용법

1) Event Object 를 생성한다.

HANDLE gv_hEvent;

int gv_operationType;

h = CreateEvent(NULL, TRUE, FALSE, NULL);

2) Thread Function을 만든다.

DWORD WINAPI MyThread(LPVOID lParam)

{

DWORD ret;

while (TRUE)

{

//gv_hEvent 가 set될 때까지 무한정 기다린다.

ret = WaiForSingleObject(gv_hEvent, INFINITE);

if(ret = WAIT_FAIL)

return 0;

}

else if ( ret = WAIT_ABANDONED) {

ResetEvent(gv_hEvent);

continue;

}

else if ( ret = WAIT_TIMEOUT) {

continue;

}

else {

if(gv_operationType==0)

return 0;

//필요한 작업을 하세요

ResetEvent(gv_hEvent);

}

}

}

3) UI 코드에서 Thread 가 작업을 하게 하고 싶다면

gv_operationType = 1;

SetEvent(gv_hEvent);

// --> 이 함수로 인해 gv_hEvent 가 signal 상태로 바뀌고, Thread의 WaitForSingleObject 가 return 된다.

** 참고로,

CreateEvent() 요놈은 네개의 인자를 가지는데,
첫번째는 생성된 핸들을 자식 프로세스가 상속받도록 하겠느냐
두번째는 이벤트를 자동으로 리셋시킬것이냐 아니냐
세번째는 초기값이 시그널이냐 아니냐
네번째는 이벤트의 이름을 스트링으로 주는것
WaitForSingleObject () 에서 이벤트를 기다리다가,
이벤트가 시그널되면 요놈이 리턴할텐데
그러고 나서 이벤트가 자동으로 리셋되기도하고, 변화가 없기도 하다.
그걸 결정하는것이 이벤트를 만들때 CreateEvent() 의 두번째 인자이다.
TRUE 면, 변화가 없고,
FALSE면, 자동으로 Reset된다.
모르고 쓰다가 낭패당하기 쉽상 ^^
예)
HANDLE h = CreateEvent(0,FALSE, TRUE,0); // 1번 요렇게 해보고
HANDLE h = CreateEvent(0,TRUE, TRUE,0); // 2번 요렇게도 해봐라
for(int i = 0; i<5; i++){
WaitForSingleObject(h, 1000);
printf("%d\n",i);
}
결과는 FALSE 인 1번의 경우 자동으로 리셋되기땜시롱 매번 1초씩 있다가 출력.
TRUE 인 2번의 경우 리셋되지 않기때문에 항상 시그널 상태이고, 기다릴것없이 두루룩~~
0,1,2,3,4 를 출력할것이다.
Posted by pkss
,