事件event與waitforsingleobject的配合使用,能夠解決很多同步問題,也可以在數據達到某個狀態時啟動另一個線程的執行,如報警。
event的幾個函數:
1、CreateEvent和OpenEvent
1 HANDLE WINAPI CreateEvent( 2 __in LPSECURITY_ATTRIBUTES lpEventAttributes, //表示安全控制,一般直接傳入NULL,表示不能被子進程繼承 3 __in BOOL bManualReset, //參數確定事件是手動置位還是自動置位,傳入TRUE表示手動置位,傳入FALSE表示自動置位。 4 __in BOOL bInitialState, //Event的初始狀態, TRUE為觸發,FALSE未觸發 5 __in LPCTSTR lpName //Event object的名字,NULL表示沒名字(without a name) 6 );
要是CreateEvent創建的事件沒名字 這個函數就沒啥用了,不多做介紹,可查看msn。
1 HANDLE WINAPI OpenEvent( //獲得已經存在的Event的事件句柄 2 __in DWORD dwDesiredAccess, 3 __in BOOL bInheritHandle, 4 __in LPCTSTR lpName //要打開的事件名字 5 );
2、SetEvent,觸發事件
1 BOOL SetEvent(HANDLE hEvent);
3、ResetEvent,使事件狀態設為未觸發,如在創建事件時第二個參數為TRUE手動設置,則需要該函數去恢復事件為未觸發狀態。
BOOL SetEvent(HANDLE hEvent);
4、PulseEvent, 如在創建事件時第二個參數為TRUE手動設置,其功能相當於SetEvent()后立即調用ResetEvent(),最好別用
1 BOOL PulseEvent(HANDLE hEvent)
5、CloseHandle(),關閉該句柄。
**********
WaitForSingleObject函數。使線程處於等待狀態,如等待某一事件的觸發。
1 DWORD WINAPI WaitForSingleObject( 2 3 HANDLE hHandle, //等待的觸發句柄 , 如前面說的Event的句柄
4 5 DWORD dwMilliseconds //等待多長時間,單位ms 如5000 則為5s 若為INFINITE表示無限等待 6 7 );
******************
一種應用的例子:
1 BOOL CMainDlg::OnInitDialog() 2 { 3 CDialog::OnInitDialog(); 4 5 m_handle = CreateEvent(NULL,FALSE,FALSE,NULL); //自動復位事件狀態,初始狀態未觸發 6 7 return TRUE; 8 } 9 //線程1函數 10 { 11 .... 12 SetEvent(m_handle); //觸發事件 13 } 14 //線程2函數 15 { 16 ...... 17 WaitForSingleObject(m_handle,INFINITE); //無限等待 事件的觸發才會執行后續程序 18 ........... 19 }
最后,事件是內核對象,事件分為手動置位事件和自動置位事件。事件Event內部它包含一個使用計數(所有內核對象都有),一個布爾值表示是手動置位事件還是自動置位事件,另一個布爾值用來表示事件有無觸發。事件可以由SetEvent()來觸發,由ResetEvent()來設成未觸發。還可以由PulseEvent()來發出一個事件脈沖。