HOW TO:使用Boost :: asio在线程之间发布消息?

时间:2013-06-26 04:22:12

标签: c++ multithreading boost boost-asio

抱歉我的英文

我已经四处寻找,但没有得到这个问题的答案: 我有一个Windows应用程序项目,使用boost线程库。我想将消息(或调用回调)从工作者的线程发布到主UI线程。我研究了boost :: asio中的示例,所有这些都在一个被阻塞的主线程中使用,但我的UI线程正在异步工作。

你能帮帮我吗?非常感谢!

2 个答案:

答案 0 :(得分:1)

由于UI线程有自己的消息循环,因此无法在其上下文中调用阻塞io_service::run()函数。您可以做的是将与轮询UI相关的方法与io_service::poll_one()

交错
  // WARINING: untested code
  MSG msg;
  while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    if (io_service_.stopped())
      io_service_.reset();
    error_code ec;
    io_service_.poll_one(ec);
  }

现在,当您将仿函数发布到io_service_时,实际上是将它们发布到主GUI线程。

(当然,如果你使用一些GUI框架,你应该使用适当的框架方法而不是PeekMessage。)

答案 1 :(得分:0)

UI线程是webkit类似的UI或普通的Windows窗体,因为如果你使用webkit,那么你可以用不同的方式处理它。 要么 尝试使用代表。 要么 最后,如果没有任何效果,你可以运行while循环检查任何新输入的向量,并从线程回调函数添加到向量。

我更喜欢你可以使用委托。 (指针功能)

以下是指针功能的示例代码:

定义一个这样的函数:

typedef boost::function<void(std::string)> fnLog;

或者如果你想专门针对Windows,那么

typedef void (__stdcall *fnLog)(char* val);

fnLog是带有std :: string参数的函数。然后将UI线程中的函数绑定到指针函数

fnLog myPointerFunc = boost::bind( &UI::f1, _1);

然后传递

  

myPointerFunc

作为回调。

进行更多参考检查 http://www.radmangames.com/programming/how-to-use-boost-function