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

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

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

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

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

// 이벤트 핸들러 = ::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 상태로 만드실거면 아래와 같이 하시면 됩니다.

::SetEvent(m_hEvent);

3. Non-Signal 상태

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

::ResetEvent(m_hEvent);

4. 실제 예제

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

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으로 됩니다.