блокировка в STA COM объекте - PullRequest
2 голосов
/ 18 сентября 2010

Я собираюсь написать элемент управления с этим дефектом.Почему именно это плохо?

Ваш элемент управления ActiveX имеет общий дефект, которого объекты ActiveX и COM однопотоковой квартиры (STA) должны избегать: объекты STA COM не могут выполнять операции блокировки в потоке STA, еслиCOM-объект также перекачивает сообщения Windows.Поэтому, если вашему элементу управления требуется выполнить операцию синхронной блокировки, ему необходимо внедрить насос сообщений Windows, ожидая завершения операции блокировки.

Источник

Я не хочу прокачивать сообщения, пока я блокирую, потому что это, кажется, заставляет мой javascript выполняться повторно.что действительно плохо.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2010

Вам необходимо разрешить потоку STA перекачивать сообщения, потому что в противном случае вызовы не могут быть перенаправлены в поток STA: поскольку в квартире уже есть поток (и он однопоточный, да), никакой другой поток не может войти в квартиру, поэтому отправка сообщения в окно потоков (скрытое) является «единственным» способом связи с потоком STA.

Это используется для обработки запросов ORPC, а также для обработки сообщений, не обязательно связанных с COM (т.е. сообщения с графическим интерфейсом). Прерывание обработки сообщения с помощью блокирующего вызова, таким образом, нарушает функциональность ORPC и потенциально может также заблокировать пользовательский интерфейс.

См. Don Box "Essential COM" для подробной информации о COM.

1 голос
/ 03 октября 2010

У вас нет ничего, чтобы качать вручную. Попробуйте использовать CoWaitForMultipleHandles вместо MsgWaitForMultipleObjects в фрагменте с форума и разрешить COM перекачивать только сообщения вызовов между потоками.

...