學(xué)習(xí)多線程之一:線程通信--利用事件對象
作者:惠州市東曉電子有限公司 龔輝斌
下載本文示例代碼
在線程之間傳送信號可以使用事件對象,用MFC的CEvent來表示。一個事件對象有兩種狀態(tài):信號態(tài)與非信號態(tài)。線程能監(jiān)視于信號態(tài)的事件,以便在適當(dāng)?shù)臅r間完成對事件的操作。
CEvent ThreadBegin;事件被創(chuàng)建后就自動處于非信號態(tài),要使用它處于信息態(tài),必須使用對件對象的成員函數(shù)SetEvent(),即:
ThreadBegin.SetEvent();線程監(jiān)視這個信號來知道事件已準(zhǔn)備就緒,從而可以進(jìn)行其它的操作。而線程通過調(diào)用API函數(shù)WaitForSingleObject()來監(jiān)視這個信號。
::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);該函數(shù)的兩個參數(shù)分別表示要檢查的事件句柄與函數(shù)等待事件時間。
一旦線程不再被掛起時,它便可以完成相關(guān)事務(wù)。但若要在主程序中通過線程結(jié)束,那么線程必須監(jiān)視接下來的這個事件,看它是否處于信號態(tài)。線程可以通過對事件進(jìn)行輪詢,這時只要調(diào)用WaitForSingleObject()即可,只是等待時間參數(shù)的值被置為0,即:
::WaitForSingleObject(ThreadBegin.m_hObject,0);
當(dāng)返回WAIT_OBJECT_0時,表示事件處于信號態(tài),否則處于非信號態(tài)。
UINT ThreadProc(LPVOID param){::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);::MessageBox((HWND)param,"Thread Activated!","Thread",MB_OK);BOOL KeepRunning=true;while (KeepRunning){int Result=::WaitForSingleObject(ThreadEnd.m_hObject,0);if (Result==WAIT_OBJECT_0)KeepRunning=false;}::MessageBox((HWND)param,"Thread Stopped!","Thread",MB_OK);return 0;}
HWND hWnd=GetSafeHwnd();AfxBeginThread(ThreadProc,hWnd);ThreadBegin.SetEvent();本文即本人在學(xué)習(xí)多任務(wù)多線程過程的手記,供大家參考,望能得到各位指點。