Асинхронные вызовы COM C ++ - PullRequest
1 голос
/ 03 сентября 2010

В ответ на часть этого вопроса, как лучше всего иметь рабочий поток, который вызывает процедуру COM в DLL, чтобы делать это асинхронно, чтобы рабочий поток не блокировался на этом звоните

Обратите внимание, что вызов этой библиотеки DLL DLL может занять много времени, так как он будет осуществлять доступ к БД и, возможно, запускать долго выполняющиеся запросы.

Я задавался вопросом, возможна ли асинхронность в этом сценарии или нужно просто ждать завершения вызова?

Ответы [ 2 ]

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

Взгляните на эту статью:

http://msdn.microsoft.com/en-us/magazine/cc301334.aspx

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

http://en.wikipedia.org/wiki/Command_pattern

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

Это, как правило, невозможно. COM заботится о требованиях к потокам для COM-сервера. Который он рекламирует в реестре. Посмотрите Regedit.exe и найдите ключ HKCR \ CLSID {guid} для используемого вами класса. Ключ ThreadingModel сообщает, что требуется.

Если он отсутствует или имеет значение Apartment, сервер сообщает, что его необходимо создать в потоке STA, и его методы интерфейса должны вызываться из того же потока. Если вы вызываете метод из другого потока, то вызов передается в поток STA. Это безопасно, но медленно, и у вас нет параллелизма.

Если для этого параметра установлено значение «Оба», то при создании объекта COM в потоке STA вызов по-прежнему маршалируется. Но не тогда, когда он был создан в потоке MTA. Только Free позволяет бесплатно создавать потоки. Что очень редко, подавляющее большинство COM-компонентов имеют многопотоковую структуру и не имеют внутренней защиты, необходимой для выполнения вызовов из рабочего потока.

Обычно в программе есть только один поток STA - поток запуска. Он должен прокачать цикл сообщений, жесткое требование для STA. Если у вас его нет, COM создаст поток STA для вас, чтобы найти хороший дом для сервера. Все звонки будут упорядочены.

Не очень хорошие новости, я уверен, что в потоке нет бесплатного ланча.

...