生成的增强线程如何
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));
获得 UI 交互?我尝试传入 boolvar,但它没有响应。
生成的增强线程如何
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boolvar));
获得 UI 交互?我尝试传入 boolvar,但它没有响应。
我假设您使用的是 Windows,尽管其他 UI 类似。
您应该使用回调函数来更新主 View 类中组成的某些结构,但要确保它受到互斥锁的保护。然后使用 PostMessage() 告诉主机这个变量的状态已经改变,在主 UI 线程中为这个消息编写一个处理程序,然后读取值并相应地更新控件。
答案是像这样使用 boost:ref 或 std::ref :
boost::thread t(boost::bind(&PMyClass::MyThreadfunc,this,callback,boost::ref(boolvar)));
通常,UI 需要完全在您的主线程上运行。(您没有指定您正在使用哪个 UI 库或平台,但几乎所有主要的 GUI 都是这种情况)。因此,您创建的线程(无论是使用 Boost 还是其他方式)都不能直接与 GUI 交互。
相反,您必须使用某种形式的通信在工作线程和主 GUI 线程之间发出信号以进行交互。无论是指示屏幕重绘、更新进度条、更改文本字段还是启用按钮 - 所有 GUI 交互都必须在主线程上进行。
一个简单的启动方法是让您的 GUI 生成工作线程,并定期在计时器上轮询它以获取状态更新(通过get
在维护线程状态的对象上调用适当的方法)。然后工作线程只需要自动更新其状态(即使用互斥锁)以便可以查询它,然后它不需要了解 GUI。
您传入的boolvar
将简单地作为参数接收到MyThreadFunc
. 在这个工作线程中,您需要提供一个处理循环或等待某个信号,否则它将像任何其他函数一样运行完成并立即返回。如果您printf
在线程函数的开头和结尾放置一个或记录调用,您应该更好地了解发生了什么。
这个话题显然相当复杂!我们需要更多细节来提供更具体的建议。