Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Роджерсон Д. - Основы COM - 2000.pdf
Скачиваний:
474
Добавлен:
13.08.2013
Размер:
2 Мб
Скачать
☆

203

Поскольку СОМ не выполняет синхронизацию вызовов компонентов, свободным потокам не нужен цикл выборки сообщений. Компонент, созданный свободным потоком, называется компонентом свободных потоков. Такой компонент не принадлежит создавшему его потоку, а используется всеми потоками совместно: все потоки имеют к нему свободный доступ.

Разделенные потоки — единственный тип потоков, которые можно использовать при работе СОМ в Microsoft Windows NT 3.51 и Microsoft Windows 95. В Windows NT 4.0 и в Windows 95 с установленной поддержкой DCOM

можно использовать свободные потоки.

Мы познакомились со свободными потоками в общем. С более интересными подробностями мы столкнемся при обсуждении маршалинга и синхронизации.

Маршалинг и синхронизация

Для правильного маршалинга и синхронизации вызовов компонента СОМ надо знать, потоком какого типа он исполняется. В случае разделенных потоков СОМ обычно выполняет необходимые маршалинг и синхронизацию. Для свободных потоков маршалинг может быть не нужен, а синхронизация возлагается на компонент.

Запомните следующие общие правила:

!" Вызовы между процессами всегда выполняются с использованием маршалинга. Мы обсуждали это в гл.

10.

!" Вызовы внутри одного потока никогда не используют маршалинг. !" Вызов компонента в разделенном потоке выполняется с маршалингом.

!" Вызов компонента в свободном потоке не всегда использует маршалинг. !" Вызовы с помощью разделенного потока синхронизируются.

!" Вызовы с помощью свободного потока не синхронизируются. !" Вызовы внутри потока синхронизируются самим потоком.

Теперь рассмотрим возможные комбинации вызовов разделенных и свободных потоков. Давайте начнем с простых случаев. Если явно не указано иное, подразумевается, что вызовы осуществляются в пределах одного процесса.

Вызовы внутри одного потока

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

Разделенный — разделенный

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

Свободный — свободный

Если клиент, выполняющийся в свободном потоке, вызывает компонент свободных потоков, то СОМ не будет синхронизировать этот вызов. Вызов будет выполнять поток клиента. Компонент должен сам синхронизировать доступ к себе, так как одновременно его может вызвать другой клиент посредством другого потока. Если клиент и компонент находятся внутри одного процесса, маршалинг вызова не выполняется.

Свободный — разделенный

Если клиент в свободном потоке вызывает компонент в подразделении, то синхронизацию вызова осуществляет СОМ. Компонент будет вызван потоком подразделения. Маршалинг интерфейса также необходим, независимо от того, в одном ли процессе или в разных находятся оба потока. В большинстве случаев маршалинг за Вас выполнит СОМ. Но иногда, как Вы скоро увидите, маршалинг приходится выполнять вручную.

Соседние файлы в предмете Программирование на C++