从boost线程在主线程上运行函数并将参数传递给该函数

时间:2012-12-03 09:54:23

标签: boost boost-asio boost-thread boost-bind

我有一些代码在一个boost线程中运行,它修改了主线程处理的东西,这个东西不起作用,这是有意义的。

在android上我将拥有Handler这是一个消息队列,它将在主线程上执行我的代码,我可以将我想要的任何参数传递给这个处理程序。

我想用boost

做同样的事情

所以在我的主线程中,我执行以下操作:

boost::thread workerThread(boost::bind(&SomeClass::pollService, this));

我的pollService方法:

SomeClass::pollService()
{
     //get some stuff from a web service
     //parse the json response
     //NEEDED part: call a function to be executed on the main thread and hand it some functions
}

P.S。我查看了很多io_service.post示例,我仍然不知道如何做到这一点,而且我还读了一个答案,说使用asio strand但我也无法理解

有人可以为我愚蠢吗? 请不要写那么抽象的东西,我不明白,我没有经验。 谢谢

1 个答案:

答案 0 :(得分:5)

是的,io_service::post()是将仿函数从一个线程发布到另一个线程的便利工具,但目标线程应该执行io_service::run(),这是阻塞函数(它的类型为io_service“消息循环“)。所以,假设你的主线程看起来像这样:

int main()
{
  // do some preparations, launch other threads...
  // ...
  io_service io;
  io.run();
}

...并假设您可以从另一个线程中运行的io访问pollService对象,您可以执行以下操作:

SomeClass::pollService()
{
  // do something...
  // ...
  io.post([=] { doStuffThatShoudRunInMainThread(); });
}

如果您的编译器不支持c ++ 11 lambdas,请使用bind - 但请注意post需要nullary functor,即不接受参数的函数对象。