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