2011-10-24 78 views
0

我有一個C++應用程序,其具有以下結構:C++多線程和活動

AAA級:有一些功能和打開一個線程其中之一的功能。 BBB類:有一些功能,其中一個功能可以打開一個線程。 CCC類:呼叫AAA和BBB,它們在其功能中都處於內部打開狀態。

在某些情況下,我在AAA線程中知道某些我想要退出的步驟並通知BBB和CCC。因爲我在一個線程(Win32Thread)中,它是一個無效函數,我在線程中運行,所以我不能將值返回給CCC。

我是C++新手(來自C#領域),不知道如何做到這一點。 (通知) 注:我不能改變這種結構。我只能在類的功能上添加或做些微小的改動。這是一個運行在腳本和大代碼上的大過程。

有什麼想法?請不要骯髒的人,如果有可能:)

添加樣本將非常有幫助。

回答

0

我不太瞭解您的問題,有點過於通用。 而你沒有指定使用什麼樣的多線程庫。

要在線程之間發送消息,通常會使用消息隊列,並使用等待句柄,鎖定和信號量來同步它們。

當然,您需要一個安全的多線程隊列來在線程間發送消息。

一種可能的解決方案:

如果線程A需要發送的消息由入隊入線程B隊列,將其喚醒,如果它是處於空閒狀態通過例如等待事件線程B。 線程B收到消息並響應在A隊列中發送另一條消息。

另一種可能的解決方案:

線程A需要將消息發送到線程B和需要的回覆,直到回覆沒有接收阻塞線程A。 線程A在線程B隊列中排隊消息,消息對象可以在函數堆棧中。然後,如果線程B處於空閒狀態,然後通過等待句柄或信號燈進入等待狀態,則喚醒線程B. 線程B在將消息出隊時,將線程A中的對象寫回來,並從線程A的等待狀態中喚醒線程A. 對象字段應該被標記爲易失性的,因爲它被兩個線程讀取\寫入。 然後,線程A使用存儲在消息對象中的值並從堆棧中刪除對象。

聽起來很複雜,但是實現起來很簡單。

如果您在Windows操作系統中,您可以使用Windows消息隊列創建隱形消息窗口,每個線程一個。第一種情況使用PostMessage,第二種情況使用SendMessage。

0

如果您不害怕Windows特定的解決方案:請致電PeekMessage()BBB線程。這將爲它創建一個Windows消息隊列。 (主線程已經有一個)。現在,您可以使用SendMessage()將消息從AAA發送到其他主題。請注意,您正在發送到線程,而不是類。任何撥打GetMessage()的電話都會看到您的信息。

0

我用於線程的典型設計是一個線程函數,它傳遞一個包含它的類的實例(它也包含該線程的實例變量)。這是你的情況嗎?該線程是否有傳入它的類的某個實例?如果他們這樣做,那麼只需跟蹤來自外部的人,並將BOOL屬性標記爲何時停止。在線程的主循環中,您只需檢查標誌以查看是否有任何業務再次循環。這是退出線程的唯一干淨方式。