Можно ли использовать 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 и ждать события.

Если событие установлено, обработайте все собранные сообщения...

Другие вопросы по тегам