CreateEvent

반응형


대기상태에 있는 스레드 모두를 실행가능한 상태로 변경해 줄 수 있다.

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

lpEventAttributes : NULL 넣어주면 된다.
bManualReset : manual-reset 모드 event로 생성할 것인지 auto-reset 모드 event로 생성할 것인지 지정.
                       만약 TRUE를 전달하면 manual-reset모드의 event가 발생하는데 
                       event가 signaled 상태에 있을 경우 resetevent함수를 호출하지 않는 이상 non-signaled상태로 돌아가지 않는다.
                       반면에 FALSE를 전달하면  WaitForSingleObject함수가 호출이 성공적으로 끝난 후에 non-signaled로 변경된다.
bInitialState : TRUE인 경우 signaled 상태의 event가 생성, FALSE인 경우 non-signaled상태의 event가 생성.
lpName : 생성되는 event의 이름을 줄경우. 없는경우는 그냥 NULL.



예제 프로그램.
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>

unsigned int WINAPI NumberOfA(void* arg);
unsigned int WINAPI NumberOfOthers(void* arg);

void ErrorHandling(char* message);
char String[100];
HANDLE hEvent;

int _tmain(int argc, _TCHAR* argv[])
{
 HANDLE hThread1, hThread2;
 DWORD dwThreadID1, dwThreadID2;

 // manual-reset 모드, 초기상태 non-signaled로 생성.
 hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
 if(hEvent == NULL)
 {
  puts("Event 오브젝트 생성 실패");
  exit(1);
 }

 // 스레드 생성, 각자 function 호출
 hThread1 = (HANDLE)_beginthreadex(NULL, 0, NumberOfA, NULL, 0, (unsigned*)&dwThreadID1);
 hThread2 = (HANDLE)_beginthreadex(NULL, 0, NumberOfOthers, NULL, 0, (unsigned*)&dwThreadID2);

 if(hThread1 == 0 || hThread2 == 0)
 {
  puts("스레드 생성 오류");
  exit(1);
 }

 fputs("문자열을 입력하세요 : ", stdout);
 fgets(String, 30, stdin);
 SetEvent(hEvent);  // event를 signaled로 변경.


 if(WaitForSingleObject(hThread1, INFINITE) == WAIT_FAILED)
  ErrorHandling("스레드 wait 오류");
 
 if(WaitForSingleObject(hThread2, INFINITE) == WAIT_FAILED)
  ErrorHandling("스레드 wait 오류");

 
 CloseHandle(hEvent);

 getchar();
 return 0;
}

unsigned int WINAPI NumberOfA(void* arg)
{
 int i;
 int count = 0;

 // 처음 event 생성시 non_signaled이므로 바로 대기상태로 됨.
  WaitForSingleObject(hEvent, INFINITE);
  for(i=0; String[i] != 0; i++)
  {
   if(String[i] == 'A')
    count++;
  }
  printf("A의 문자의 수 : %d\n", count);
  return count;
}
unsigned int WINAPI NumberOfOthers(void* arg)
{
 int i;
 int count = 0;

 // 처음 event 생성시 non_signaled이므로 바로 대기상태로 됨.
 WaitForSingleObject(hEvent, INFINITE);
 for(i=0; String[i] != 0; i++)
 {
  if(String[i] != 'A')
   count++;
 }
 printf("A가 아닌 문자의 수 : %d\n", count);
 return count;
}

void ErrorHandling(char* message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}


입력한 문자열을 해석하기 위해 두개의 스레드를 생성한다.
이 두개의 스레드는 이벤트를 생성할 때부터 manual-set으로 생성하고 non_signaled이기 때문에
WaitForSingleObject에서 무한 대기 하다가 SetEvent에 의해 signaled상태로 바뀌어 실행하게 된다.

'Study > Network' 카테고리의 다른 글

_beginthreadex  (2) 2010.10.30
WaitForSingleObject  (0) 2010.10.30
TAGS.

Comments