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

203

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

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

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

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

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

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

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

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

10.

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

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

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

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

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

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

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

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

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

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

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

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

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