Здравствуйте, Стрелок, Вы писали:
С>ATL-визард создает модуль (AtlModule) в главном потоке программы. Поэтому, все обращения к объектам нужно вести в главном потоке. Для вызова объекта из другого потока нужно пользоваться очередью сообщений (PostMessage/SetEvent/WaitForSingleObject) или маршалингом объектной ссылки(CoMarshalInterThreadInterfaceInStream). В связи с этим у меня вопросы:
С>1. Достаточно ли один раз отмаршалить интерфейс в другой поток или же это нужно делать каждый раз при вызове?
Если у вас потоки в разных апартментах (почитать можно
здесьАвтор(ы): Jeff Prosise
Дата: 22.02.2001
В этой статье подробно рассматриваются подразделения (apartments) в модели
COM. Автор описывает различные виды подразделений, показывает, каким образом
подразделения назначаются потокам и объектам, а также даёт ряд полезных
советов, которые позволят вам избежать ошибок при работе с подразделениями.
), то нужно маршалить указатель на интерфейс в другой поток один раз.
С>2. Можно ли создать AtlModule и все объекты в другом потоке, чтобы вовсе забыть о межпоточных взаимодействиях?
Не знаю. Можно создавать обьекты с помощью CoCreateInstance в другом потоке и не маршалить вызовы.