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() | sem_init() |
SetEvent() | sem_post() |
WaitForSingleObject() | sem_wait() |
CloseHandle() | sem_destroy() |