1.使用全局變量(窗體不適用)
實(shí)現線(xiàn)程間通信的方法有很多,常用的主要是通過(guò)全局變量、自定義消息和事件對象等來(lái)實(shí)現的。其中又以對全局變量的使用最為簡(jiǎn)潔。該方法將全局變量作為線(xiàn)程監視的對象,并通過(guò)在主線(xiàn)程對此變量值的改變而實(shí)現對子線(xiàn)程的控制。
由于這里的全局變量需要在使用它的線(xiàn)程之外對其值進(jìn)行改變,這就需要通過(guò)volatile關(guān)鍵字對此變量進(jìn)行說(shuō)明。使用全局變量進(jìn)行線(xiàn)程通信的方法非常簡(jiǎn)單,通過(guò)下面給出的示例代碼能夠對其有一個(gè)基本的認識。
全局變量在線(xiàn)程通信中的應用多用在主線(xiàn)程對子線(xiàn)程的控制上,而從子線(xiàn)程向主線(xiàn)程的信息反饋則多采用自定義消息的方式來(lái)進(jìn)行。這里對自定義消息的使用同使用普通自定義消息非常相似,只不過(guò)消息的發(fā)送是在子線(xiàn)程函數中進(jìn)行的。該方法的主體是自定義消息,應首先定義自定義消息并添加對消息的響應代碼。
用PostMessage()或SendMessage()消息傳遞函數.
3.使用事件內核對象(相當好用)
利用事件(Event)內核對象對線(xiàn)程的通信要復雜些,主要通過(guò)對事件對象的監視來(lái)實(shí)現線(xiàn)程間的通信。事件對象由CreateEvent()函數來(lái)創(chuàng )建,具有兩種存在狀態(tài):置位與復位,分別由SetEvent()和ResetEvent()來(lái)產(chǎn)生。事件的置位將通過(guò)WaitForSingleObject()或WaitForMultipleObjects()之類(lèi)的通知等待函數繼續執行。
// 事件句柄
HANDLE hEvent = NULL;
UINT ThreadProc7(LPVOID pParam)
{
while(true)
{
// 等待事件發(fā)生
DWORD dwRet = WaitForSingleObject(hEvent, 0);
// 如果事件置位則退出線(xiàn)程,否則將繼續執行
if (dwRet == WAIT_OBJECT_0)
break;
else
{
Sleep(2000);
AfxMessageBox("線(xiàn)程正在運行!");
}
}
AfxMessageBox("線(xiàn)程終止運行!");
return 0;
}
……
void CSample06View::On
{
// 創(chuàng )建事件
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// 啟動(dòng)線(xiàn)程
AfxBeginThread(ThreadProc7, NULL);
}
void CSample06View::On
{
// 事件置位
SetEvent(hEvent);
}
上面這段代碼展示了事件對象在線(xiàn)程通信中的作用。在創(chuàng )建線(xiàn)程前首先創(chuàng )建一個(gè)事件對象hEvent,這里CreateEvent()函數所采用的四個(gè)參數分別表示句柄不能被繼承、事件在置位后將由系統自動(dòng)進(jìn)行復位、事件對象初始狀態(tài)為復位狀態(tài)和不指定事件名。在創(chuàng )建的子線(xiàn)程中使用WaitForSingleObject()對hEvent進(jìn)行監視。WaitForSingleObject()的函數原型為:
DWORD WaitForSingleObject(
HANDLE hHandle, //等待對象的句柄
DWORD dwMilliseconds //超過(guò)時(shí)間間隔
);
函數將在hHandle對象有信號時(shí)或是在等待時(shí)間超出由dwMilliseconds設定的超時(shí)時(shí)間間隔返回。其返回值可以為WAIT_ABANDONED、WAIT_OBJECT_0和WAIT_TIMEOUT,分別表示被等待的互斥量(Mutex)對象沒(méi)有被釋放、等待的對象信號置位和超時(shí)。通過(guò)對返回值的判斷可以區分出引起WaitForSingleObject()函數返回的原因。在本例中只關(guān)心WAIT_OBJECT_0的返回值,當通過(guò)SetEvent()將hEvent置位后即可使WaitForSingleObject()立即返回并通過(guò)跳出循環(huán)而結束線(xiàn)程。
聯(lián)系客服