2

生成的增强线程如何

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

获得 UI 交互?我尝试传入 boolvar,但它没有响应。

4

3 回答 3

0

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

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

于 2013-09-10T10:46:55.757 回答
0

答案是像这样使用 boost:ref 或 std::ref :

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

于 2013-09-10T06:06:30.860 回答
0

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

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

一个简单的启动方法是让您的 GUI 生成工作线程,并定期在计时器上轮询它以获取状态更新(通过get在维护线程状态的对象上调用适当的方法)。然后工作线程只需要自动更新其状态(即使用互斥锁)以便可以查询它,然后它不需要了解 GUI。

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

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

于 2013-09-10T00:31:16.430 回答