[WinAPI] CreateEvent, SetEvent, ResetEvent, WaitForSingleObject 사용 예제

[WinAPI] CreateEvent, SetEvent, ResetEvent, WaitForSingleObject 사용 예제

안녕하세요, 오늘은 이벤트에 대해 알아보도록 하겠습니다.

WaitForSingleObject 사용법은 여기를 참고해주세요.

1. 이벤트 생성
1
2
3
4
5
6
HANDLE CreateEventA(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL                  bManualReset,
  BOOL                  bInitialState,
  LPCSTR                lpName
);

사용 예는 아래와 같습니다.

1
2
// 이벤트 핸들러 = ::CreateEvent( NULL, SetEvent시 Signal 상태 유지할건지,  Signal 상태로 생성할 건지, 이벤트 이름);
HANDLE m_hEvent = CreateEvent( NULL, FALSE, FALSE, _T( "Test_EVENT" ) );

2번째 인자가 TRUESetEvent함수 호출 시 계속 Signal 상태가 되고 FALSE이면 한번만 Signal 상태로 됩니다.
인자의 명칭을 보면 알 수 있듯이 수동으로 Reset하냐 마냐 결정하는 겁니다.

3번째 인자가 TRUE 초기 상태가 Signal이 되고 FALSE이면 Non-Signal 입니다.

이것도 인자 명칭보면 초기 상태라고 써져 있네요.

2. Signal 상태

Signal 상태로 만드실거면 아래와 같이 하시면 됩니다.

1
::SetEvent(m_hEvent);

3. Non-Signal 상태

Non-Signal 상태로 만드실거면 아래와 같이 하시면 됩니다.

1
::ResetEvent(m_hEvent);

4. 실제 예제

쓰레드 상에서 아래와 같이 사용 됩니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
UINT CMFCApplication::TestThread1( LPVOID lpVoid )
{
    CMFCApplication *pDlg = (CMFCApplication *)lpVoid;
 
    while ( 1 )
    {
        DWORD dwRes = WaitForSingleObject( pDlg->m_hEvent, 3000 );
 
        if ( WAIT_FAILED == dwRes )
        {
            TRACE( _T( "WAIT_FAILED\n" ) );
        }
        else if ( WAIT_ABANDONED == dwRes )
        {
            TRACE( _T( "WAIT_ABANDONED\n" ) );
        }
        else if ( WAIT_OBJECT_0 == dwRes )
        {
            TRACE( _T( "WAIT_OBJECT_0\n" ) );
        }
        else if ( WAIT_TIMEOUT == dwRes )
        {
            TRACE( _T( "WAIT_TIMEOUT\n" ) );
        }
        else
        {
            TRACE( _T( "UNKNOWN\n" ) );
        }
    }
 
    return 0;
}

이벤트가 Signal 상태이면 WAIT_OBJECT_0으로 됩니다.