본문 바로가기
프로그래밍/C

Win32 API ] 이벤트 / CreateEvent, SetEvent, ResetEvent

by eteo 2023. 10. 31.

 

Windows 프로그래밍에서 이벤트를 생성하고 다루는 함수인 CreateEvent, SetEvent, ResetEvent 와 이벤트 대기 함수인 WaitForSingleObject 를 사용해서 스레드 간 통신 또는 동기화를 수행할 수 있다.

 

 

 

CreateEvent()

 

CreateEvent 함수는 이벤트 객체를 생성한다. 이벤트 객체는 signaled, non-signaled 상태가 있는데 SetEvent 함수를 통해 이벤트 신호를 보내거나 WaitForSingleObject 함수를 통해 이벤트 신호를 받을 수 있다.

 

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

 

  • lpEventAttributes: 보안 속성 설정을 위한 포인터인데 보안 설정을 하지 않을 경우 보통 NULL로 설정한다.
  • bManualReset: 수동 리셋 모드 여부, TRUE 또는 FALSE
    • TRUE: WaitForSingleObject 함수로 대기 중인 스레드가 시그널을 받으면 이벤트 객체는 자동으로 논시그널 상태로 변하지 않기 때문에 수동으로 ResetEvent를 호출하여 이벤트 객체를 논시그널 상태로 설정해야 한다.
    • FALSE: WaitForSingleObject 함수로 대기 중인 스레드가 시그널을 받으면 이벤트 객체는 자동으로 논시그널 상태로 변하기 때문에, 이 모드에서는 ResetEvent 함수를 호출할 필요가 없다.
  • bInitialState: 초기 상태 설정 여부. TRUE 또는 FALSE, TRUE 시 초기상태가 signalled이고 FALSE이면 non-signalled이다.
  • lpName: 이벤트 객체의 이름인데 이름을 사용하지 않을 경우 보통 NULL로 설정한다.

 

 

 

 

 

SetEvent()

 

이벤트 객체를 시그널 상태로 설정한다. 다른 스레드에서 대기하고 있는 경우 해당 이벤트 객체를 신호로 받게 된다.

 

BOOL SetEvent(
  HANDLE hEvent
);

 

 

 

ResetEvent()

 

이벤트 객체를 논시그널 상태로 설정한다.

BOOL ResetEvent(
  HANDLE hEvent
);

 

 

사용 예시.

 

#include <Windows.h>
#include <iostream>
 
int main() {
    HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if (hEvent == NULL) {
        std::cerr << "Failed to create event." << std::endl;
        return 1;
    }
 
    // 이벤트를 시그널 상태로 설정
    SetEvent(hEvent);
 
    // 이벤트 핸들이 시그널 상태가 될 때까지 대기
    DWORD result = WaitForSingleObject(hEvent, INFINITE);
 
    if (result == WAIT_OBJECT_0) {
        std::cout << "Event occurred." << std::endl;
    }
    else {
        std::cout << "Wait failed." << std::endl;
    }
 
    CloseHandle(hEvent);
 
    return 0;
}