在UI线程上运行代码

时间:2013-03-20 11:36:05

标签: c++ winapi asynchronous

我需要提交代码才能在消息抽取的线程中运行,没有定义多个自定义消息。
像Java SwingUtilities.invokeLater()之类的东西(注意:我已经有一个允许lambda可回调的实用程序)

我已经尝试了::SendMessageCallback & SendAsyncProc,但是当调用::GetMessage时,相同的发送方线程会调用回调(这是该API的要求......)

ATM我的另一种选择是定义一个传递回调的自定义消息(即WM_USER_EXECUTE),但是这需要准备好接收该消息的所有目标! 我更喜欢更通用的方式。

2 个答案:

答案 0 :(得分:1)

使用对MsgWaitForMultipleObjectsEx()API的调用替换GetMessage调用。这是很多打字,但它应该工作......

http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx

答案 1 :(得分:1)

最后,我找到了一种方法来获得我需要的东西,所以我将解决方案留给其他人。

  1. 使用RegisterWindowMessage()获取安全消息ID(可能是偏执狂,但机制对目标来说完全是透明的。)
  2. 使用GetWindowThreadProcessId
  3. 从其HWND获取目标窗口的线程ID
  4. 安装::SetWindowsHookEx参数化为WH_CALLWNDPROC
  5. 的挂钩
  6. 在钩子例程中忽略除了我们特殊的msg以外的所有消息。
    当找到该MSG时,运行wParam携带的回调
  7. 使用SendMessage传递特殊的MSG id和包含要执行的代码的例程的指针来触发整个事件
  8. 所有东西都可以封装在一个函数中并用作invokeOnWndProc(HWND,lambda_Callback)

    PROS:代码在UI线程中运行,完全透明,同步行为!
    缺点:相当重量级..