在UI线程上运行代码
问题描述:
我需要提交代码以在执行消息抽取的线程中运行,而不是定义了几个自定义消息。
有点像Java的SwingUtilities.invokeLater()
(注:我已经有一个工具,它允许一个lambda是callbackable)在UI线程上运行代码
我已经尝试::SendMessageCallback & SendAsyncProc
,但回调是由同一个发件人线程调用时调用::GetMessage
(即api的要求...)
自动柜员机我的选择是定义一个自定义消息(即WM_USER_EXECUTE),通过回调,但这需要所有的目标准备接收该消息! 我宁愿采用更通用的方式。
答
最后我找到了一种方式来获得我所需要的,所以我离开我为别人解决方案。
- 获取与
RegisterWindowMessage()
安全的消息ID(也许偏执,但机制是完全trasparent为目标..) - 得到其HWND目标窗口与
GetWindowThreadProcessId
- 线程ID安装与
::SetWindowsHookEx
挂钩参数WH_CALLWNDPROC
- 在hook例程中忽略除我们特殊的那些之外的所有消息。
当味精被发现,运行携带其中wParam - 触发了整个事情与
SendMessage
经过特殊味精id和常规的包含要执行的代码指针回调
一切都可以被封装在函数中用作invokeOnWndProc(HWND,lambda_Callback)
优先级:代码在UI线程中运行,完全透明,同步行为!
缺点:相当重量级..
答
用对MsgWaitForMultipleObjectsEx()API的调用替换GetMessage调用。这是一个很大的打字,但它应该工作...
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684245%28v=vs.85%29.aspx
QueueUserAPC()? – 2013-03-20 11:42:47
@开始我正在调查,谢谢你的一刻,我不知道api – MrAduer 2013-03-20 11:51:38
@Martin Argh!它没有工作。在APC排队后,没有任何事情发生,直到接收器线程进入可改变的状态(例如通过调用SleepEx以bAlertable TRUE) 显然,:: GetMessage的内部不会使线程处于这种状态:( – MrAduer 2013-03-20 12:20:00