我有一些代码在一个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
但我也无法理解
有人可以为我愚蠢吗? 请不要写那么抽象的东西,我不明白,我没有经验。 谢谢
答案 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,即不接受参数的函数对象。