是否可以使用SendNotifyMessage进入COM STA线程?

时间:2018-03-21 09:30:40

标签: .net winapi com sta

我正在研究需要在另一个线程的COM STA线程上执行代码的C ++ MFC / COM应用程序(包括VBA和.NET代码)。

一种方法,就是使用PostMessage函数将消息发布到隐藏的HWND_MESSAGE窗口,但它很慢(在我的应用程序中,它可能需要大约4毫秒才能进入STA这样。

相反,使用SendNotifyMessage代替显着更快。在这种情况下,需要< 〜0.1ms进入STA。

由于应用程序的性质和发生的呼叫次数(我无法控制),这种差异很重要。不幸的是,我遇到了很难确定的奇怪错误。有些可能与STA重入有关,例如,如果某些.NET代码在内部传送消息而在WaitHandle.WaitOne上阻塞,我注意到了重入。 VBA也参与其中。

我的问题是:

  • 可以SendNotifyMessage用于进入STA线程,而不是PostMessage吗?
  • 如果是这样,有没有办法让它与.NET“玩得很好”? (使其无阻塞或使用阻止非抽空等待不是一种选择)
  • (奖金)SendNotifyMessage如何快速进入STA线程?

1 个答案:

答案 0 :(得分:0)

当你在线程之间进行这种特殊的通信并且你有大量的消息(正如你在评论中写的那样),当你使用完全不同的通信形式时,这不会更好。

创建消息的内部列表,使用关键部分保护它并使用事件通知其他线程。

让其他线程执行其消息循环并使用MsgWaitForMultipleObjects而不是PeekMessage / GetMessage并等待事件。

如果设置了该事件,请处理收集的所有消息......