안녕하세요, 오늘은 이벤트에 대해 알아보도록 하겠습니다.
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번째 인자가 TRUE면 SetEvent함수 호출 시 계속 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으로 됩니다.