[System] Event

나장승현
|2024. 1. 3. 20:36

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
}

'💻 Computer Science > System' 카테고리의 다른 글

[System] High-Level File I/O  (1) 2024.01.24
[System] Low-Level File I/O  (1) 2024.01.23
[System] Thread  (0) 2024.01.04
[System] WaitForSingleObject  (0) 2024.01.03
[System] 윈도우 프로세스 생성  (1) 2024.01.03