1

我有一些在 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
}

PS我看过很多io_service.post例子,但我仍然不知道该怎么做,而且我读了一个说可以使用asio strand但我也无法理解的答案。

有人可以为我哑巴吗?请不要写太抽象的东西,我不会理解,我没有这方面的经验。谢谢

4

1 回答 1

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 lambda,请使用bind-- 但请注意,它post需要空函数,即不接受参数的函数对象。

于 2012-12-03T11:00:24.673 回答