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
找到该消息后,运行带有wParam的回调
SendMessage
传递特殊消息id和包含要执行代码的例程指针,触发整个事件优点:代码在UI线程中运行,完全透明,行为同步
缺点:相当重。@Marting我正在调查,谢谢你,我不知道api@Martin啊!这不管用。。APC排队后,在接收方线程进入可更改状态(即通过使用bAlertable TRUE调用SleepEx)之前,不会发生任何事情。显然::GetMessage的内部不会使线程保持这种状态:(在消息循环中添加
SleepEx(0,TRUE);
。@Abyx-发生了其他事情。IIRC,GetMessage()API确实允许处理排队的APC。@MartinJames,我的意思是while(GetMessage(..){DispatchMessage(..);SleepEx(0,TRUE);}