多執行緒:在 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);
.
.
.
您還想知道關於哪些方面的詳細資訊?
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: