抱歉我的英文
我已经四处寻找,但没有得到这个问题的答案: 我有一个Windows应用程序项目,使用boost线程库。我想将消息(或调用回调)从工作者的线程发布到主UI线程。我研究了boost :: asio中的示例,所有这些都在一个被阻塞的主线程中使用,但我的UI线程正在异步工作。
你能帮帮我吗?非常感谢!答案 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