2011-01-07 168 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

可以提高从升压线程或非线程提振互斥。