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