共用方式為


多線程:MFC 程式設計秘訣

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

從多個線程存取物件

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

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

從非 MFC 線程存取 MFC 物件

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

Windows 句柄地圖

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

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

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

如需處理地圖的詳細資訊,請參閱 技術附註 3。 如需線程本機記憶體的詳細資訊,請參閱 Windows SDK 中的線程本機記憶體 和使用 線程本機記憶體

在線程之間通訊

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

另請參閱

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