Event
- CreateEventA()
- 어떤 시점을 나타날 때 사용
- WaitForSingleObject의 인자가 됨
- Signaled(Set), Non-Signaled(Reset) 상태가 있음
- 한 Event를 다수의 Process가 지켜볼 때, 하나의 Process가 Triggered 되면 Auto Reset됨 -> 나머지 Process는 Auto Reset 때문에 Set을 수신하지 못하고 계속 기다리게 됨 -> 이를 ManualReset으로 변경하면 다른 Process도 Triggered 되게 할 수 있음
- 이름을 지정할 수 있는데 이미 있는 이름이라는 오류가 난다면 Create 하지 말고 Open으로 사용
HANDLE m_hEvent = NULL;
void createEvent()
{
CloseHandle(m_hEvent);
m_hEvent = ::CreateEvent(NULL, TRUE, FALSE, L"TEST_EVENT"); // 두번째 인자의 True는 ManualReset 하겠다는 의미
if (m_hEvent == NULL) {
if (GetLastError() == ERROR_ALREADY_EXISTS) {
m_hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"TEST_EVENT");
if (m_hEvent == NULL) {
AfxMessageBox(L"ERROR: Failed to create event object.");
return;
}
}
return;
}
}
void waitEvent()
{
if (WaitForSingleObject(m_hEvent, INFINITE) == WAIT_OBJECT_0)
AfxMessageBox(L"Set Event");
}
void setEvent()
{
SetEvent(m_hEvent);
Sleep(300); // 참조하고 있는 다른 프로세스에도 시그널이 갈 수 있도록 sleep
ResetEvent(m_hEvent); // ManualReset
}