2012-09-05 120 views
0

这是我目前的做法是如何的样子:如何实现多线程异步操作?

// Somewhere in a UI class 
// Called when a button called "Start" clicked 
MyWindow::OnStartClicked(Event &sender) 
{ 
    _thread = new boost::thread(boost::bind(&MyWindow::WorkToDo, this)); 
} 

MyWindow::WorkToDo() 
{ 
    for(int i = 1; i < 10000000; i++) 
    { 
    int percentage = (int)((float)i/100000000.f); 
    _progressBar->SetValue(percentage); 
    _statusText->SetText("Working... %d%%", percentage); 
    printf("Pretend to do something useful...\n"); 
    } 
} 

// Called on every frame 
MyWindow::OnUpdate() 
{ 
    if(_thread != 0 && _thread->timed_join(boost::posix_time::seconds(0)) 
    { 
    _progressBar->SetValue(100); 
    _statusText->SetText("Completed!"); 
    delete _thread; 
    _thread = 0; 
    } 
} 

但是这恐怕是远远安全的,因为我一直在程序执行结束时获得未处理的异常。

我基本上想把一个繁重的任务分成另一个线程而不阻塞GUI部分。

+0

这段代码,您提出应该工作。你能不知怎的指定“未处理的异常”? – MeloMCR

+0

我使用SFML2渲染东西,异常来自SFML的MutexImpl.cpp。如果细节来自另一个图书馆,我担心这个问题会过于具体。 – drowneath

回答

1

有很多方法可以做到这一点很难确定。在Windows中,您通常会根据GUI操作将线程关闭,并且结果和/或进度将通过消息泵循环返回到GUI。您将声明或注册自定义窗口消息,并将工作线程的各种报告位置发布到主窗口句柄或子窗口句柄设置中,以监视异步进度。

有很多很多方法可以做到这一点。以上只是一个描述,但对于中等任务来说,我发现通常可以解决这个问题。既然如此,那么你就可以使用这里显示的代码。你直接设置并绕过消息循环(不是真的,但只要你需要担心你是),所以这应该工作。

0

如果你可以使用升压或C++ 11的,具有升压/的std ::未来的一个镜头和异步