- •7.1. Основные определения
- •7.4. Обработка ошибок
- •7.4.1. Возвращаемое значение типа hresult
- •7.4.2. Возврат информации об ошибках
- •8. Стандарт бинарного интерфейса com
- •8.1. Основные определения
- •8.2. Доступ к com-объектам, работа с памятью
- •8.3. Интерфейс iUnknown и наследование интерфейсов
- •8.3.1. Интерфейс iUnknown
- •8.3.2. Получение указателя на интерфейс – QueryInterface
- •8.3.3. Управление временем жизни объекта – подсчет ссылок
- •8.4. Реализация com
- •9. Управление потоками com
- •9.1. Основные определения
- •9.2. Однопоточные и многопоточные апартаменты (sta и mta)
- •9.2.1. Однопоточные апартаменты (sta)
- •9.2.2. Многопоточный апартамент (mta)
- •9.2.3. Взаимодействие апартаментов
- •9.3. Межпроцессорное взаимодействие
- •9.4. Маршалинг
- •9.4.1. Стандартный маршалинг
- •9.4.2. TypeLib-маршалинг
- •9.4.3. Ручной маршалинг
- •9.5. Заключение
9.2.3. Взаимодействие апартаментов
Все процессы имеют апартаментную модель, просто некоторые апартаменты содержат один поток, а некоторые – несколько. Поточная модель применима к апартаменту, а не к процессу. Она также может быть применима к CoClass’у но не к DLL-модулю. Разные классы в одной DLL могут иметь разные модели потоков. Но, все же, ATL позволяет определять так называемую глобальную потоковую модель, влияющую на потоковые характеристики всех входящих в модуль объектов.
Процесс, содержащий два или более STA, и не содержащий MTA, называется процессом с апартаментной моделью (apartment model process).
Процесс с одним потоком является частным случаем STA-модели. Такой процесс называется однопоточным (single-threaded process).
Процесс, содержащий MTA и один или более STA, называется процессом со смешанной моделью (mixed model process).
Процесс, содержащий MTA и не содержащий STA, называется свободно-поточным процессом (free-threaded process).
Главным апартаментом процесса считается тот, который был первым проинициализирован. В однопоточном процессе он остается единственным.
Модели потоков в COM предоставляют механизм совместной работы клиентов и серверов, использующие различные архитектуры потоков. Поддерживаются вызовы между объектами с разными моделями потоков как в разных процессах, так и внутри одного. С точки зрения вызывающего объекта все вызовы объектов вне процесса выглядят одинаково, неважно, какие потоки использует вызываемый объект, и наоборот.
В СОМ не существует аналогичной CORBA сессионной идеологии работы с потоками, когда все вызовы от одного клиента выполняются в одном потоке, а другого – в другом. Но если каждый клиент будет создавать отдельную копию STA-компонента, то внешне это будет похоже на сессионный метод CORBA. Единственное отличие заключается в том, что если двум таким компонентам взбредет в голову обратиться друг к другу, или к общему STA-компоненту, то в COM эти методы будут автоматически синхронизированы.
Выбор поточной модели для объекта зависит от назначения этого объекта. Объекту, управляющему некоторым общим ресурсом, (объекту, к которому производятся частые параллельные обращения), лучше поддерживать многопоточность. Это обеспечит максимальную эффективность при обслуживании клиентов. С другой стороны, объект, взаимодействующий с одним пользователем, может поддерживать STA для синхронизации вызовов.
Межпроцессная и межпоточная модели похожи. Если нужно передать указатель на интерфейс объекту в другом апартаменте (или потоке) в этом же процессе, используется такая же модель маршалинга, что и для объектов в разных процессах. С помощью указателя на стандартный объект маршалинга можно произвести маршалинг указателей на интерфейсы через границы потока (апартамента) так же, как и между процессами.
На сегодня большинство языков программирования позволяют создавать COM-объекты в STA-архитектуре, но только C++ позволяет создавать многопоточные компоненты. Библиотека ATL позволяют существенно облегчить эту непростую задачу. Скоро должна появиться седьмая версия VB. Разработчики обещают ввести в эту версию поддержку режима свободных потоков.