多線程:在 MFC 中建立背景工作線程
背景工作線程通常用來處理使用者不應該等候繼續使用應用程式的背景工作。 重新計算和背景列印等工作是背景工作線程的良好範例。 本主題詳述建立背景工作線程所需的步驟。 主題包括:
建立背景工作線程是一項相對簡單的工作。 執行線程只需要兩個步驟:實作控制函式並啟動線程。 不需要從 CWinThread 衍生類別。 如果您需要 的特殊版本 CWinThread
,您可以衍生類別,但對大多數簡單的背景工作線程來說並不需要它。 您可以在不修改的情況下使用 CWinThread
。
啟動線程
有兩個多載版本 AfxBeginThread
:一個只能建立背景工作線程,另一個可以建立使用者介面線程和背景工作線程。 若要使用第一個多載開始執行背景工作線程,請呼叫 AfxBeginThread,並提供下列資訊:
控制函式的位址。
要傳遞至控制函式的參數。
(選擇性)線程所需的優先權。 預設值為一般優先順序。 如需可用優先順序層級的詳細資訊,請參閱 Windows SDK 中的 SetThreadPriority 。
(選擇性)線程所需的堆疊大小。 預設值與建立線程的大小堆疊相同。
(選擇性)如果您想要以暫停狀態建立線程,CREATE_SUSPENDED。 默認值為 0,或正常啟動線程。
(選擇性)所需的安全性屬性。 預設值與父線程相同。 如需此安全性資訊格式的詳細資訊,請參閱 Windows SDK 中的SECURITY_ATTRIBUTES 。
AfxBeginThread
會為您建立並初始化 CWinThread
對象、啟動物件,並傳回其位址,以便稍後參考它。 整個程式都會進行檢查,以確保如果建立的任何部分失敗,所有對象都會正確解除分配。
實作控制函式
控制函式會定義線程。 輸入此函式時,線程會啟動,並在結束時終止線程。 此函式應具有下列原型:
UINT MyControllingFunction( LPVOID pParam );
參數是單一值。 函式在此參數中接收的值是建立線程對象時傳遞至建構函式的值。 控制函式可以以任何方式解譯此值。 它可以視為純量值或包含多個參數之結構的指標,也可以予以忽略。 如果參數參考 結構,結構不僅可以將數據從呼叫端傳遞至線程,還可以將數據從線程傳回給呼叫端。 如果您使用這類結構將數據傳回給呼叫端,線程必須在結果就緒時通知呼叫端。 如需從背景工作線程與呼叫端通訊的相關信息,請參閱 多線程:程序設計秘訣。
函式終止時,它應該會傳回 UINT 值,指出終止的原因。 一般而言,此結束代碼為 0,表示成功,而其他值則表示不同類型的錯誤。 這完全相依於實作。 某些線程可能會維護物件的使用計數,並傳回該物件的目前使用次數。 若要查看應用程式如何擷取此值,請參閱 多線程:終止線程。
使用 MFC 連結庫撰寫的多線程程式有一些限制。 如需這些限制和使用線程的其他秘訣的描述,請參閱 多線程:程序設計秘訣。
控制函式範例
下列範例示範如何定義控制函式,並從程式的另一個部分使用它。
UINT MyThreadProc( LPVOID pParam )
{
CMyObject* pObject = (CMyObject*)pParam;
if (pObject == NULL ||
!pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))
return 1; // if pObject is not valid
// do something with 'pObject'
return 0; // thread completed successfully
}
// inside a different function in the program
.
.
.
pNewObject = new CMyObject;
AfxBeginThread(MyThreadProc, pNewObject);
.
.
.