2011-05-25 61 views
-1

我有一個對話框,帶有一些複選框控件項目。從多個線程(C++)訪問對話框項目

該對話框可以創建一個工作線程,它可以在運行時訪問其中的某些控制項。

但是,用戶還可以在工作線程運行時修改這些複選框控件項目。

雖然不太可能發生這種情況,但線程會在用戶想要更改它們的時刻嘗試讀取其中的某些項目。

如何在主線程和工作線程之間保護對話框項併發訪問

我想我應該創建一個互斥體,並且很容易從工作線程使用這個互斥體,但是當用戶想要的時候,我沒有看到我可以在哪裏插入代碼來鎖定具有相同互斥體的對話框項目更改。

有沒有人可以幫助我呢?

在此先感謝。
Gingko

回答

0

你還沒有說明你正在使用哪個平臺,所以我會假設無論它是哪個平臺,它都遵循通用規則,即只有UI線程才能訪問UI控件。有了這個規則,你有明顯的推論,其他線程無法直接讀取複選框狀態。

的解決方案如下:

  1. 創建對應於在對象的複選框表示對話框一些私人布爾字段。
  2. 每當用戶修改複選框時,更新相應的布爾值字段。
  3. 將這些字段作爲其他線程讀取的只讀屬性公開。
  4. (可選)使用互斥鎖保護對布爾字段的所有訪問。

第4項是可選的,因爲在我知道的所有體系結構中,訪問布爾字段時都沒有撕裂的危險。

這樣做的關鍵在於避免讀取和寫入UI控制狀態不是線程安全的問題。但是在總體設計中,您概述了永遠不會擺脫數據競賽。當你的工作線程讀取狀態時,用戶可能只是改變了它,或者可能正要改變它。你不知道,一旦你允許工作線程與UI線程並行操作,你就必須接受這個事實。

+0

對不起,我正在使用Visual Studio在Windows(任何最新版本)上工作。 其實,我期待直接共享對話框項目,因爲現在我需要訪問一個複選框項目,可能以後我需要訪問更復雜的項目(如兩個線程可能想要的列表框訪問)。 Gingko – GingkoFr 2011-05-25 11:29:08

+0

@Gingko您只能與該HWND具有親和力的線程中的窗口控件(即具有'HWND'的任何東西)進行交互。這是調用CreateWindow的線程。幾乎總是這是你的應用程序的主線。您不能直接從不同的線程訪問窗口項目。 – 2011-05-25 11:36:06