http://hi.baidu.com/andywangcn/item/50d640c325290a2aef4665c4
1、
啟動(dòng)線(xiàn)程:CWinThread* AfxBeginThread( 線(xiàn)程函數(shù),this );
2、通常導(dǎo)致線(xiàn)程終止的兩種情況是:控制函數(shù)退出或不允許線(xiàn)程完成運(yùn)行。如果字處理器使用后臺(tái)打印線(xiàn)程,若成功完成打印,則控制函數(shù)將正常終止。但是,如果用戶(hù)要取消打印,后臺(tái)打印線(xiàn)程則不得不提前終止。本主題介紹如何實(shí)現(xiàn)每一種情況,以及在終止后如何獲取線(xiàn)程的退出代碼。
(1)正常線(xiàn)程終止
對(duì)于輔助線(xiàn)程,正常線(xiàn)程終止很簡(jiǎn)單:退出控制函數(shù)并返回表示終止原因的值。可以使用 函數(shù)或 return 語(yǔ)句。一般情況下,0 表示成功完成,但這取決于您自己。
對(duì)于用戶(hù)界面線(xiàn)程,該過(guò)程也很簡(jiǎn)單:從用戶(hù)界面線(xiàn)程內(nèi)調(diào)用 Platform SDK 中的 。PostQuitMessage 采用的唯一參數(shù)是線(xiàn)程的退出代碼。對(duì)于輔助線(xiàn)程,0 通常表示成功完成。
(2)過(guò)早的線(xiàn)程終止過(guò)早終止線(xiàn)程幾乎一樣簡(jiǎn)單:從線(xiàn)程內(nèi)調(diào)用 。將所需的退出代碼作為唯一參數(shù)傳遞。這將停止執(zhí)行線(xiàn)程、解除對(duì)線(xiàn)程堆棧的分配、分離附加到線(xiàn)程的所有 DLL 并從內(nèi)存中刪除線(xiàn)程對(duì)象。
必須從要終止的線(xiàn)程內(nèi)調(diào)用 AfxEndThread。如果要從其他線(xiàn)程終止線(xiàn)程,必須設(shè)置兩個(gè)線(xiàn)程間的通信方法。
舉一個(gè)例子:
可以創(chuàng)建一個(gè)信號(hào)量,用WaitForSingleObject函數(shù)來(lái)檢測(cè)該信號(hào)量的狀態(tài)。
成員變量 m_hThreadEvent;
m_hThreadEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
線(xiàn)程的執(zhí)行函數(shù):
for ( ; ; )
{ DWORD dwRetVal;
dwRetVal = WaitForSingleObject( m_hThreadEvent, 100 );
if ( dwRetVal == WAIT_TIMEOUT )
{ // TODO:
}
else
{
// stop receive text thread.
DWORD dwExitCode;
GetExitCodeThread( m_pThreadRecv->m_hThread, &dwExitCode );
AfxEndThread( dwExitCode, TRUE );
}
}
要結(jié)束線(xiàn)程時(shí),使用SetEvent,將信號(hào)量置為有信號(hào)。
該線(xiàn)程是在信號(hào)量有信號(hào)時(shí),退出。
(3)TerminateThread
在CWinThread對(duì)象中有線(xiàn)程的句柄,可以使用該句柄強(qiáng)行殺死線(xiàn)程。但是不推薦使用這種方式,當(dāng)可以正常結(jié)束的時(shí)候,選擇前兩種方法較好。
檢索線(xiàn)程的退出代碼若要獲取輔助線(xiàn)程或用戶(hù)界面線(xiàn)程的退出代碼,請(qǐng)調(diào)用 函數(shù)。有關(guān)此函數(shù)的信息,請(qǐng)參見(jiàn) Platform SDK。此函數(shù)獲取線(xiàn)程(存儲(chǔ)在 CWinThread 對(duì)象的 m_hThread
數(shù)據(jù)成員中)的句柄和 DWORD 的地址。
如果線(xiàn)程仍然是活動(dòng)的,GetExitCodeThread 將 STILL_ACTIVE 放置在提供的 DWORD 地址中;否則將退出代碼放置在該地址中。
檢索 對(duì)象的退出代碼還需要一步。默認(rèn)情況下,當(dāng) CWinThread 線(xiàn)程終止時(shí),刪除該線(xiàn)程對(duì)象。這意味著不能訪問(wèn) m_hThread
數(shù)據(jù)成員,因?yàn)?CWinThread 對(duì)象不再存在。若要避免出現(xiàn)這種情況,請(qǐng)執(zhí)行以下操作之一:
將 m_bAutoDelete
數(shù)據(jù)成員設(shè)置為 FALSE。這使 CWinThread 對(duì)象在線(xiàn)程終止后仍可以繼續(xù)存在。然后可以在線(xiàn)程終止后,訪問(wèn) m_hThread
數(shù)據(jù)成員。但是,如果使用此方法,就得銷(xiāo)毀 CWinThread 對(duì)象,因?yàn)榭蚣懿粫?huì)自動(dòng)刪除該對(duì)象。這是首選方法。
單獨(dú)存儲(chǔ)線(xiàn)程的句柄。創(chuàng)建線(xiàn)程后,(使用 ::DuplicateHandle)將其 m_hThread
數(shù)據(jù)成員復(fù)制到其他變量,并通過(guò)該變量訪問(wèn)該成員。這樣,終止后即會(huì)自動(dòng)刪除對(duì)象,并且仍然可以找到線(xiàn)程終止的原因。請(qǐng)注意:在可以復(fù)制句柄之前,線(xiàn)程不終止。執(zhí)行此操作的最安全的方式是將 CREATE_SUSPENDED 傳遞到 ,存儲(chǔ)句柄,然后通過(guò)調(diào)用 繼續(xù)執(zhí)行線(xiàn)程。
任一方法都可以使您確定 CWinThread 對(duì)象終止的原因。