C++ boost::线程UI交互
一个派生的boost线程如何实现C++ boost::线程UI交互,c++,multithreading,boost,C++,Multithreading,Boost,一个派生的boost线程如何实现 boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar)); 获取UI交互?我试图传入boolvar,但没有响应。一般来说,UI需要完全在主线程上运行。(您没有指定正在使用的UI库或平台,但实际上所有主要GUI都是这样)。因此,您创建的线程(无论是使用Boost还是其他方式)不能直接与GUI交互 相反,您必须使用某种形式的通信在工作线程和主GUI线程之间发送信号
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));
获取UI交互?我试图传入boolvar,但没有响应。一般来说,UI需要完全在主线程上运行。(您没有指定正在使用的UI库或平台,但实际上所有主要GUI都是这样)。因此,您创建的线程(无论是使用Boost还是其他方式)不能直接与GUI交互 相反,您必须使用某种形式的通信在工作线程和主GUI线程之间发送信号以进行交互。无论是发出屏幕重画的信号、更新进度条、更改文本字段还是启用按钮,所有GUI交互都必须在主线程上进行 一种简单的启动方法是,GUI生成工作线程,并定期在计时器上轮询它以进行状态更新(通过在维护线程状态的对象上调用适当的
get
方法)。然后,工作线程只需要自动更新其状态(即使用互斥),以便可以查询它,然后它就不需要了解GUI
您传入的boolvar
将作为MyThreadFunc
的参数接收。在这个工作线程中,您需要提供一个处理循环或等待一些信号,否则它将像任何其他函数一样运行到完成并立即返回。如果在线程函数的开始和结束处放置printf
或日志调用,您最好看看发生了什么
这个话题显然相当复杂!我们需要更多的细节来提供更具体的建议。答案是使用boost:ref或std::ref,就像这样:
boost::线程t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boost::ref(boolvar)) 我假设您使用的是Windows,尽管其他UI也类似
您应该使用回调函数来更新主视图类中组成的某些结构,但在更新时请确保它受到互斥的保护。然后使用PostMessage()告诉主机此变量的状态已更改,在主UI线程中为此消息编写一个处理程序,然后读取值并相应地更新控件。如果
boost::thread
的行为类似于std::thread
,则此处不需要bind
。对于我找到的std::thread。我试着传递一个引用,但它在boost中不起作用-这真的可能吗?你可以使用boost.Asio的io_服务
()谢谢。通过回调可以方便地从线程中获取信息。但是为什么没有简单的方法将其放入其中呢?通常,您使用完成任务所需的所有信息初始化线程。这可以在线程上运行的对象的构造函数中完成(在生成之前),也可以在实际生成线程时将数据传递给线程函数。这不容易吗?如果需要在线程的生存期内传入数据,可以使用队列或类似结构。