2011-01-07 273 views
2

我發現有很多東西讓一個線程在繼續之前等待另一個線程完成執行,但那不是我想要做的。我對使用任何多線程apis不是很熟悉,但現在我正在嘗試學習boost。我的情況是我正在使用我的主線程(從int main()開始)創建一個負責與主GUI交互的類的實例。然後調用一個類函數,創建一個boost線程,然後創建GUI並運行消息泵。我想要做的事情是當我的主線程調用類成員函數來創建GUI時,我不希望該函數返回,直到我從新創建的線程中告訴它。這樣,我的主線程無法繼續並從GUI類中調用更多與GUI線程交互的函數,直到該線程完成GUI創建並進入消息循環。我想我可能會弄清楚它是否是多個boost線程對象互相交互,但是當它是主線程(非boost對象)與boost線程對象交互時,我迷路了。最後,我想在我的主線程中調用一個循環來調用一個類函數(以及其他任務),以檢查用戶是否在GUI中輸入了任何新輸入(購買由更新到結構中的消息循環檢測到的任何更改並更改布爾告訴類函數中的主線程發生了變化)。任何建議任何這將不勝感激。有主線程等待一個線程完成任務(但沒有完成)

這是主線程調用的成員函數。

 
int ANNGUI::CreateGUI() 
{ 
    GUIMain = new Main(); 
    GUIThread = new boost::thread(boost::bind(&Main::MainThreadFunc, GUIMain)); 
    return 0; 
}; 

這是增強線程啓動功能。

 
void Main::MainThreadFunc() 
{ 
    ANNVariables = new GUIVariables; 
    WndProc = new WindowProcedure; 
    ANNWindowsClass = new WindowsClass(ANNVariables, WndProc); 
    ANNWindow = new MainWindow(ANNVariables); 
    GUIMessagePump = new MessagePump; 
    ANNWindow->ShowWindows(); 
    while(true) 
    { 
     GUIMessagePump->ProcessMessage(); 
    } 
}; 

BTW,一切編譯罰款,當我運行它,它的作品我只是把睡眠()在主線程,所以我可以使用GUI有點玩。

回答

5

如果你想等待線程簡單地完成使用join()方法(http://www.boost.org/doc/libs/1_45_0/doc/html/thread/thread_management.html#thread.thread_management.thread.join

如果你正在等待一個信號,一個簡單的解決方法是使用一個互斥。提升的障礙互斥應該爲你工作:

http://www.boost.org/doc/libs/1_45_0/doc/html/thread/synchronization.html#thread.synchronization.barriers

可以提高從升壓線程或非線程提振互斥。