0

对不起我的英语不好

我四处搜索,但没有得到这个问题的答案:我有一个 Windows 应用程序项目,使用 boost 线程库。我想将消息(或调用回调)从工作线程发布到主 UI 线程。我研究了 boost::asio 中的样本,它们都在阻塞的主线程中使用,但我的 UI 线程正在异步工作。

你能帮帮我吗?多谢!

4

2 回答 2

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.)

于 2013-06-26T08:52:36.033 回答
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);

然后通过

我的指针函数

作为回调。

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

于 2013-06-26T05:46:28.590 回答