C++ 在UI线程上运行代码

C++ 在UI线程上运行代码,c++,winapi,asynchronous,C++,Winapi,Asynchronous,我需要提交代码,以便在执行消息泵送的线程中运行,而不定义多个自定义消息。 类似于JavaSwingUtilities.invokeLater()(注意:我已经有了一个允许lambda可回调的实用程序) 我已经尝试了::SendMessageCallback&SendAsyncProc,但是回调在调用::GetMessage时由同一个发送者线程调用(这是该api的要求… ATM我的选择是定义一个自定义消息(即WM_USER_EXECUTE),将回调传递给该消息,但这需要所有目标都准备好接收该消息

我需要提交代码,以便在执行消息泵送的线程中运行,而不定义多个自定义消息。
类似于Java
SwingUtilities.invokeLater()
(注意:我已经有了一个允许lambda可回调的实用程序)

我已经尝试了
::SendMessageCallback&SendAsyncProc
,但是回调在调用
::GetMessage
时由同一个发送者线程调用(这是该api的要求…

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

将GetMessage调用替换为对MsgWaitForMultipleObjectsEx()API的调用。打字太多了,但应该能用


最后,我找到了一种获得我所需要的东西的方法,所以我把我的解决方案留给别人

  • 使用
    RegisterWindowMessage()
    获取安全消息id(可能是偏执狂,但该机制完全适用于目标..)
  • 使用
    GetWindowThreadProcessId
  • 使用
    安装挂钩:SetWindowsHookEx
    使用
    WH\u CALLWNDPROC
  • 在钩子例程中,忽略除特殊消息之外的所有MSG。
    找到该消息后,运行带有wParam的回调
  • 通过
    SendMessage
    传递特殊消息id和包含要执行代码的例程指针,触发整个事件
  • 一切都可以封装在一个函数中,并用作invokeowndproc(HWND,lambda_回调)

    优点:代码在UI线程中运行,完全透明,行为同步

    缺点:相当重。

    @Marting我正在调查,谢谢你,我不知道api@Martin啊!这不管用。。APC排队后,在接收方线程进入可更改状态(即通过使用bAlertable TRUE调用SleepEx)之前,不会发生任何事情。显然::GetMessage的内部不会使线程保持这种状态:(在消息循环中添加
    SleepEx(0,TRUE);
    。@Abyx-发生了其他事情。IIRC,GetMessage()API确实允许处理排队的APC。@MartinJames,我的意思是
    while(GetMessage(..){DispatchMessage(..);SleepEx(0,TRUE);}