線程終止的問題

 有兩種情況可以使線程結束:控制函數結束或者根本就不允許線程完成,而提前終止它。我們可以想象在WORD中進行後臺打印,如果打印結束了,那線程就可以結束了。如果用戶中止了打印,那後臺打印線程也要終止了。本文將主要介紹對這兩種情況的實現,並且介紹如何獲得線程的結束代碼。
對於工作線程,結束它是比較容易的:退出線程函數然後返回一個結束原因的代碼就是了。用戶可以使用AfxEndThread函數或直接利用return返回。通常0代表成功返回,這不是硬性規定,一切要取決於你了。對於用戶界面線程,調用::PostQuitMessage,它所要的唯一的參數就是返回代碼,也就是工作線程中的那個碼,性質是一樣的。0通常代表成功。
提前終止一個線程也不難:在線程函數中調用AfxEndThread就是了,其中要傳入的參數就是返回代碼。這會停止線程的執行,釋放線程棧,及與線程相關的DLL,並從內存中刪除線程對象。AfxEndThread必須在線程函數內調用,如果用戶希望從一個線程結束另一個線程,則需要在兩個線程間建立通信機制。


如果需要獲得線程返回代碼,只需要調用::GetExitCodeThread就可以了。這個函數的具體作用就看大傢俱體去查幫助了。它傳入的是線程的句柄,和一個提向返回代碼的指針。將來就從那個指針得到返回代碼。如果線程仍然處於活動狀態,那麼::GetExitCodeThread得到的返回代碼爲STILL_ACTIVE,如果已經退出則得到的是返回代碼的地址。獲得CWinThread對象的返回代碼還需要一點麻煩,通常,當CWinThread線程結束時,線程對象就刪除了,因爲這個對象不存在了,也就沒有辦法訪問對象的m_hThread變量了,爲了避免這種情況,可以有兩種方法:


將m_bAutoDelete設置爲FALSE,這使得線程結束後CWinThread對象仍然存在,這樣用戶就可以訪問m_hThread了,但是如果用戶使用這種方法,用戶需要自己析構CWinThread對象。這種方法是推薦的方法。


下一個方法是另外保存線程的句柄。在線程創建後,將m_hThread保存在另一個變量中,以後訪問這個變量就是了。但是要小心,在複製句柄以前線程並沒有結束,最安全的方法是在AfxBeginThread中傳入CREATE_SUSPENDED,保存句柄,然後通過調用ResumeThread,重新開始線程。這兩種方法都可以幫助用戶得到CWinThread對象的返回代碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章