共用方式為


多線程:MFC 中的終止線程

兩個正常情況導致線程終止:控制函式結束或不允許線程執行完成。 如果文字處理器使用線程進行背景列印,控制函式會在列印順利完成時正常終止。 不過,如果使用者想要取消列印,背景列印線程必須提前終止。 本主題說明如何實作每個情況,以及如何在線程終止之後取得線程的結束代碼。

一般線程終止

針對背景工作線程,一般線程終止很簡單:結束控制函式並傳回值,表示終止的原因。 您可以使用 AfxEndThread 函式或 return 語句。 一般而言,0 表示成功完成,但這是由您決定的。

針對使用者介面線程,程式同樣簡單:從使用者介面線程中呼叫 Windows SDK 中的 PostQuitMessage 。 唯 PostQuitMessage 一採用的參數是線程的結束代碼。 至於背景工作線程,0 通常表示成功完成。

過早線程終止

過早終止線程幾乎很簡單:從線程內呼叫 AfxEndThread 。 傳遞所需的結束代碼作為唯一的參數。 這會停止線程的執行、解除分配線程的堆疊、中斷連結至線程的所有 DLL,以及從記憶體中刪除線程物件。

AfxEndThread 必須從線程內呼叫,才能終止。 如果您想要從另一個線程終止線程,您必須設定兩個線程之間的通訊方法。

擷取線程的結束代碼

若要取得背景工作角色或使用者介面線程的結束代碼,請呼叫 GetExitCodeThread 函式。 如需此函式的相關信息,請參閱 Windows SDK。 此函式會接受線程的句柄(儲存在 m_hThread 對象的數據成員 CWinThread 中),以及 DWORD 的位址。

如果線程仍在使用中, GetExitCodeThread 請將STILL_ACTIVE放在提供的 DWORD 位址中;否則,結束代碼會放在這個位址中。

擷取 CWinThread 物件的結束代碼需要額外的步驟。 根據預設,當 CWinThread 線程終止時,會刪除線程物件。 這表示您無法存取資料成員,m_hThreadCWinThread因為物件已不存在。 若要避免這種情況,請執行下列其中一項動作:

  • 將數據 m_bAutoDelete 成員設定為 FALSE。 這可讓 CWinThread 對象在終止線程之後生存。 接著,您可以在線程終止之後存取 m_hThread 資料成員。 不過,如果您使用這項技術,您必須負責終結 CWinThread 對象,因為架構不會自動為您刪除它。 這是慣用的方法。

  • 分別儲存線程的句柄。 建立線程之後,將其數據成員 (using::DuplicateHandle) 複製到m_hThread另一個變數,並透過該變數加以存取。 如此一來,當終止發生時,物件會自動刪除,您仍然可以找出線程終止的原因。 請小心線程不會終止,才能複製句柄。 若要這樣做,最安全的方式是將CREATE_SUSPENDED傳遞至 AfxBeginThread、儲存句柄,然後藉由呼叫 ResumeThread 繼續線程。

任一 CWinThread 種方法都可讓您判斷對象終止的原因。

另請參閱

使用 C++ 和 MFC 進行多執行緒處理
_endthread、_endthreadex
_beginthread、_beginthreadex
ExitThread