对不起我的英语不好
我四处搜索,但没有得到这个问题的答案:我有一个 Windows 应用程序项目,使用 boost 线程库。我想将消息(或调用回调)从工作线程发布到主 UI 线程。我研究了 boost::asio 中的样本,它们都在阻塞的主线程中使用,但我的 UI 线程正在异步工作。
你能帮帮我吗?多谢!
对不起我的英语不好
我四处搜索,但没有得到这个问题的答案:我有一个 Windows 应用程序项目,使用 boost 线程库。我想将消息(或调用回调)从工作线程发布到主 UI 线程。我研究了 boost::asio 中的样本,它们都在阻塞的主线程中使用,但我的 UI 线程正在异步工作。
你能帮帮我吗?多谢!
由于 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
.)
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