線程中CreateEvent和SetEvent及WaitForSingleObject的用法 2008-08-11 10:56 首先介紹CreateEvent是創(chuàng)建windows事件的意思,作用主要用在判斷線程退出,程鎖定方面. CreateEvent 函功能描述:創(chuàng)建或打開一個命名的或無名的事件對象. 當你創(chuàng)建一個線程時,其實那個線程是一個循環(huán),不像上面那樣只運行一次的。這樣就帶來了一個問題,在那個死循環(huán)里要找到合適的條件退出那個死循環(huán),那么是怎么樣實現(xiàn)它的呢?在Windows里往往是采用事件的方式,當然還可以采用其它的方式。在這里先介紹采用事件的方式來通知從線程運行函數(shù)退出來,它的實現(xiàn)原理是這樣,在那個死循環(huán)里不斷地使用WaitForSingleObject函數(shù)來檢查事件是否滿足,如果滿足就退出線程,不滿足就繼續(xù)運行。當在線程里運行阻塞的函數(shù)時,就需要在退出線程時,先要把阻塞狀態(tài)變成非阻塞狀態(tài),比如使用一個線程去接收網(wǎng)絡數(shù)據(jù),同時使用阻塞的SOCKET時,那么要先關(guān)閉SOCKET,再發(fā)送事件信號,才可以退出線程的。 當然我感覺重要應用方面還是用來鎖定,實現(xiàn)所謂的pv功能。 下面介紹函數(shù)功能,參數(shù)等 1.CreateEvent
2. WaitForSingleObject的用法 WaitForSingleObject的用法 DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds ); 參數(shù)hHandle是一個事件的句柄,第二個參數(shù)dwMilliseconds是時間間隔。如果時間是有信號狀態(tài)返回WAIT_OBJECT_0,如果時間超過dwMilliseconds值但時間事件還是無信號狀態(tài)則返回WAIT_TIMEOUT。 hHandle可以是下列對象的句柄: Change notification Console input Event Job Memory resource notification Mutex Process Semaphore Thread Waitable timer WaitForSingleObject函數(shù)用來檢測hHandle事件的信號狀態(tài),當函數(shù)的執(zhí)行時間超過dwMilliseconds就返回,但如果參數(shù)dwMilliseconds為INFINITE時函數(shù)將直到相應時間事件變成有信號狀態(tài)才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執(zhí)行后面的代碼。在這里舉個例子: 先創(chuàng)建一個全局Event對象g_event: CEvent g_event; 在程序中可以通過調(diào)用CEvent::SetEvent設(shè)置事件為有信號狀態(tài)。 下面是一個線程函數(shù)MyThreadPro() UINT CFlushDlg::MyThreadProc( LPVOID pParam ) { WaitForSingleObject(g_event,INFINITE); For(;;) { …………. } return 0; } 在這個線程函數(shù)中只有設(shè)置g_event為有信號狀態(tài)時才執(zhí)行下面的for循環(huán),因為g_event是全局變量,所以我們可以在別的線程中通過g_event. SetEvent控制這個線程。 還有一種用法就是我們可以通過WaitForSingleObject函數(shù)來間隔的執(zhí)行一個線程函數(shù)的函數(shù)體 UINT CFlushDlg::MyThreadProc( LPVOID pParam ) { while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0) { ……………… } return 0; } 在這個線程函數(shù)中可以可以通過設(shè)置MT_INTERVAL來控制這個線程的函數(shù)體多久執(zhí)行一次,當事件為無信號狀態(tài)時函數(shù)體隔MT_INTERVAL執(zhí)行一次,當設(shè)置事件為有信號狀態(tài)時,線程就執(zhí)行完畢了(return 0)。
|
|
來自: swordinhand > 《Program》