共用方式為


多執行緒:MFC 程式設計提示

多執行緒應用程式比單一執行緒應用程式更嚴格,以確保作業是以預定順序進行,而且多個執行緒存取的任何資料都不會損毀。 本主題說明使用 Microsoft Foundation Class (MFC) 程式庫設計多執行緒應用程式時避免潛在問題的技術。

從多個執行緒存取物件

MFC 物件本身不是安全線程。 除非您使用 MFC 同步處理類別和/或適當的 Win32 同步處理物件,例如重要區段,否則兩個不同的執行緒無法操作相同的物件。 如需重要區段和其他相關物件的詳細資訊,請參閱 Windows SDK 中的同步處理

類別庫會在內部使用重要區段來保護全域資料結構,例如偵錯記憶體配置所使用的區段。

從非 MFC 執行緒存取 MFC 物件

如果您有使用 CWinThread 物件以外的 方式建立執行緒的多執行緒應用程式,則無法從該執行緒存取其他 MFC 物件。 換句話說,如果您想要從次要執行緒存取任何 MFC 物件,您必須使用多執行緒:建立使用者介面執行緒或多執行緒:建立背景工作執行緒中所述 的其中一種方法來建立該執行緒 這些方法是唯一允許類別庫初始化處理多執行緒應用程式所需的內部變數。

Windows Handle 地圖

一般規則是執行緒只能存取它所建立的 MFC 物件。 這是因為暫存和永久的 Windows 控制碼對應會保留線上程本機儲存體中,以協助維護保護免于同時存取多個執行緒。 例如,背景工作執行緒無法執行計算,然後呼叫檔 UpdateAllViews 的成員函式,讓包含修改新資料之檢視的視窗。 這完全沒有作用,因為從 CWnd 物件到 HWND 的對應是主要執行緒的本機對應。 這表示一個執行緒可能會有從 Windows 控制碼到 C++ 物件的對應,但另一個執行緒可能會將相同的控制碼對應至不同的 C++ 物件。 在一個執行緒中所做的變更不會反映在另一個執行緒中。

此問題有數種方式。 第一個是將個別控制碼(例如 HWND)而不是 C++ 物件傳遞至背景工作執行緒。 然後,背景工作執行緒會呼叫適當的 FromHandle 成員函式,將這些物件新增至其暫存對應。 您也可以藉由呼叫 Attach 將 物件新增至執行緒的永久對應,但只有在您保證物件存在的時間超過執行緒時,才應該這麼做。

另一種方法是建立與背景工作執行緒將執行之不同工作對應的新使用者定義訊息,並使用 將這些訊息張貼至應用程式的主視窗 ::PostMessage 。 這種通訊方法類似于兩個不同的應用程式,不同之處在于兩個執行緒都在相同的位址空間中執行。

如需處理地圖的詳細資訊,請參閱 技術附注 3 。 如需執行緒本機儲存體的詳細資訊,請參閱 Windows SDK 中的執行緒本機儲存體 和使用 執行緒本機儲存體

線上程之間通訊

MFC 提供一些類別,可讓執行緒同步存取物件,以維護執行緒安全性。 這些類別的使用方式描述于 多執行緒:如何使用同步處理類別 多執行緒:何時使用同步處理類別 。 如需這些物件的詳細資訊,請參閱 Windows SDK 中的同步處理

另請參閱

使用 C++ 和 MFC 進行多執行緒處理