boost :: thread UI交互

时间:2013-09-09 23:42:08

标签: c++ multithreading boost

如何产生提升线程

boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));

获取UI互动?我试过传入boolvar,但没有反应。

3 个答案:

答案 0 :(得分:0)

通常,UI需要完全在主线程上运行。 (您没有指定您正在使用的UI库或平台,但几乎所有主要GUI都是这种情况)。因此,您创建的线程(无论是使用Boost还是其他方式)都无法直接与GUI交互。

相反,您必须使用某种形式的通信在工作线程和主GUI线程之间发出信号以进行交互。无论是发出重绘屏幕信号,更新进度条,更改文本字段还是启用按钮 - 所有GUI交互都必须在主线程上进行。

一种简单的启动方式是让GUI生成工作线程,并在定时器上定期轮询它以进行状态更新(通过在保持线程状态的对象上调用适当的get方法)。然后工作线程只需要原子地更新其状态(即使用互斥锁),以便可以查询它,然后它不需要知道GUI。

您传入的boolvar只会作为参数收到MyThreadFunc。在这个工作线程中,你需要提供一个处理循环或等待一些信号,否则它将像任何其他函数一样运行完成并立即返回。如果在线程函数的开头和结尾放置printf或日志记录调用,则应该更好地了解正在发生的事情。

这个话题显然很复杂!我们需要更多细节来提供更具体的建议。

答案 1 :(得分:0)

答案是使用boost:ref或std :: ref,如下所示:

boost :: thread t(boost :: bind(& PMyClass :: MyThreadfunc,this,callback,boost :: ref(boolvar)));

答案 2 :(得分:0)

我会假设您使用的是Windows,但其他UI类似。

您应该使用回调函数来更新主View类中组成的某些结构,但确保它在受到保护时受到互斥锁的保护。然后使用PostMessage()告诉大型机该变量的状态已更改,在主UI线程中为此消息编写处理程序,然后读取该值并相应地更新控件。