我正在研究需要在另一个线程的COM STA线程上执行代码的C ++ MFC / COM应用程序(包括VBA和.NET代码)。
一种方法,就是使用PostMessage
函数将消息发布到隐藏的HWND_MESSAGE
窗口,但它很慢(在我的应用程序中,它可能需要大约4毫秒才能进入STA这样。
相反,使用SendNotifyMessage
代替显着更快。在这种情况下,需要< 〜0.1ms进入STA。
由于应用程序的性质和发生的呼叫次数(我无法控制),这种差异很重要。不幸的是,我遇到了很难确定的奇怪错误。有些可能与STA重入有关,例如,如果某些.NET代码在内部传送消息而在WaitHandle.WaitOne
上阻塞,我注意到了重入。 VBA也参与其中。
我的问题是:
SendNotifyMessage
用于进入STA线程,而不是PostMessage
吗?SendNotifyMessage
如何快速进入STA线程?答案 0 :(得分:0)
当你在线程之间进行这种特殊的通信并且你有大量的消息(正如你在评论中写的那样),当你使用完全不同的通信形式时,这不会更好。
创建消息的内部列表,使用关键部分保护它并使用事件通知其他线程。
让其他线程执行其消息循环并使用MsgWaitForMultipleObjects
而不是PeekMessage
/ GetMessage
并等待事件。
如果设置了该事件,请处理收集的所有消息......