Skip to content

WindowsApi:CreateEvent

동기화객체의 하나로, 이벤트객체를 생성한 후 해당 이벤트에 대하여 Signal 또는 Nonsignal 상태로 만들 수 있다.

How to use CreateEvent

프로토타입은 아래와 같다.

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 요건 모바일환경에는 항상 NULL로 해줘야 함다
BOOL bManualReset, // 수동(TRUE), 자동(FALSE)
BOOL bInitialState, // 생성시 이벤트가 적용된 상태이냐 아니냐
LPTSTR lpName); // 이벤트네임
  • 두번째 파라미터(bManualReset)를 수동(FALSE)으로 둘 경우 SetEvent() API로 이벤트를 발생시킬 경우, 수동으면 이벤트 발생후 ResetEvent() API를 반드시 해주어야 이벤트가 다시 발생된다.
  • 세번째 파라미터는 처음 생성부터 이벤트가 적용된 상태이냐 아니냐인데 TRUE로 생성하시면 첨부터 이벤트가 발생해있는 상태에서 시작이고 아니면 이벤트를 대기하게 됩니다.
  • 네번째 파라미터는 이벤트네임을 부여하는 건데 저는 프로세스간 통신에서 매우 유용하게 씁니다. 전혀 상관이 없는 프로세스간에 이벤트 네임만 동일하게 부여해놓고 발생(SetEvent())을 시키면 상대 프로세스에서 반응하죠.

아래와 같이 사용한다.

HANDLE hEvent;
hEvent = CreateEvent(NULL, FALSE, FALSE, L"STUPID");

SetEvent(hEvent);         //hEvent 발생
ResetEvent(hEvent);       //hEvent 재생(수동일때만...)

이벤트 대기는 WaitForSingleObject(), WaitForMultiObject() API들을 이용한다. 모든 핸들이 그렇듯 종료할땐, CloseHandle()를 사용한다.

Linux 와 비교

Linux에서는 이를 위한 특별한 장치가 존재하지 않으므로 semaphore를 이용해서 이를 구현한다. 다만 초기화시에 초기값을 0으로 주기만 하면 된다.

Windows

Linux

CreateEvent()
OpenEvent()

sem_init()

SetEvent()

sem_post()

WaitForSingleObject()

sem_wait()
sem_trywait()

CloseHandle()

sem_destroy()

See also