2011-01-07 10 views
2

他のスレッドが他のスレッドが実行を終了するのを待っていることがわかったが、これはやりたいことではない。私は非常にマルチスレッドapisを使用することに精通していないが、今私はブーストを学ぼうとしている。私の状況は、メインGUIとのやりとりを担当するクラスのインスタンスを作成するために、メインスレッド(int main()の最初のスレッド)を使用していることです。その後、GUIを作成してメッセージポンプを実行するブーストスレッドを作成するクラス関数が呼び出されます。私がしたいことは、メインスレッドがGUIを作成するためにクラスメンバ関数を呼び出すときに、私が新しく作成したスレッドからそれを伝えるまで、その関数を返さないようにすることです。このようにして、私のメインスレッドはGUIスレッドと対話するGUIクラスから、そのスレッドがGUI作成を完了してメッセージループに入るまで、より多くの機能を継続して呼び出すことができません。私は、複数のブーストスレッドオブジェクトが相互に作用していた場合にはそれを理解することができるかもしれないと思うが、メインスレッド(非ブーストオブジェクト)がブーストスレッドオブジェクトとやりとりするとき、最終的には、主なスレッドのループを使って、(他のタスクの中で)ユーザーが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(); 
    } 
}; 

ところで、すべてが正常にコンパイルし、私はそれを実行したとき、私は少しのGUIで遊ぶことができますので、それは私がちょうどメインスレッドで()睡眠を入れて動作します。

答えて

5

あなたは、単に(結合を使用終了するスレッドを待ちたい場合)(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

あなたはブーストスレッドまたは非ブーストスレッドからmutexを高めることができます。