Можно ли использовать SendNotifyMessage для входа в поток COM STA?
Я работаю над приложением C++ MFC/COM (включая код VBA и.NET), которое должно выполнять код в потоке COM STA из другого потока.
Один из способов, который работает, это использовать PostMessage
функция для отправки сообщения на скрытый HWND_MESSAGE
окно, но это довольно медленно (в моем приложении это может занять ~4 мс, чтобы попасть на STA таким образом.
Вместо того, чтобы использовать SendNotifyMessage
вместо этого значительно быстрее. В этом случае требуется <~ 0,1 мс, чтобы попасть на STA.
Из-за характера приложения и количества звонков, которые происходят (вне моего контроля), эта разница имеет значение. К сожалению, я сталкиваюсь со странными ошибками, которые трудно точно определить. Некоторые из них могут относиться к повторному входу в STA, например, если какой-то код.NET внутренне прокачивает сообщения при блокировке WaitHandle.WaitOne
Я заметил повторный вход. VBA также участвует.
Мои вопросы:
- Можно
SendNotifyMessage
использоваться, чтобы попасть на поток STA, вместоPostMessage
? - если так, есть ли способ заставить его "играть хорошо" с.NET? (Что делает его без блокировки или с использованием блокирующих без накачки ожидает не вариант)
- (бонус) как
SendNotifyMessage
на самом деле попасть в поток STA так быстро?
1 ответ
Когда вы делаете это специальное общение между потоками и у вас есть большое количество сообщений (как вы написали в комментарии), было бы лучше, если вы используете совершенно другую форму общения.
Создайте внутренний список ваших сообщений, защитите его критическим разделом и используйте событие, чтобы уведомить другой поток.
Позвольте другому потоку сделать свой цикл сообщений и использовать MsgWaitForMultipleObjects
вместо PeekMessage
/ GetMessage
и ждать события.
Если событие установлено, обработайте все собранные сообщения...