Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::线程UI交互_C++_Multithreading_Boost - Fatal编程技术网

C++ boost::线程UI交互

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线程如何实现

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_服务
()谢谢。通过回调可以方便地从线程中获取信息。但是为什么没有简单的方法将其放入其中呢?通常,您使用完成任务所需的所有信息初始化线程。这可以在线程上运行的对象的构造函数中完成(在生成之前),也可以在实际生成线程时将数据传递给线程函数。这不容易吗?如果需要在线程的生存期内传入数据,可以使用队列或类似结构。