доставка окон
ActiveX. Для профессионалов (+CD) — Издательский дом «Питер»
Книги
Издательство
Отдел сбыта
Проекты
English version
Главная
Новинки
Новости
Рейтинг продаж
Файлы/Download
Клуб Профессионал
Партнерская программа
Ваш кабинет
Если вы уже зарегистрированы, введите ваши данные:
Логин
Пароль
Регистрация | Вспомнить пароль
Библиотека: А. Деннинг. ActiveX. Для профессионалов (+CD)
Приложение b
Потоковые модели COM
В этом приложении описаны различные потоковые модели COM. Оно создано по материалам статьи Q150777 KnowledgeBase «Descriptions and Workings of OLE Threading Models», написанной Вину Черианом (Vinoo Cherian).
1.1 Общие сведения
Работать с OLE могут сразу несколько потоков программы-компонента. Компоненты могут использовать одну из потоковых моделей, поддерживаемых OLE:
Однопоточная модель — с OLE работает лишь один поток, обращения к объектам OLE синхронизируются OLE.
Совместная модель — с OLE работают несколько потоков, обращения к объектам OLE синхронизируются OLE.
Свободная модель — с OLE работают несколько потоков, обращения к объектам OLE синхронизируются самими объектами.
Смешанная модель — в одном компоненте используется доставка окон совместная доставка окон свободная модель.
1.2 Дополнительная информация
Потоковые модели OLE предоставляют механизм, при помощи которого организуется совместная работа клиентов доставка окон объектов с различными потоковыми архитектурами. Например, некоторый внутрипроцессный объект может быть спроектирован в расчете на однопоточную модель доставка окон не умеет синхронизировать обращения от клиентов. Если к такому объекту одновременно обратятся несколько потоков многопоточного клиента, он «сломается» или приведет к возникновению ошибок. Предоставленный OLE механизм обеспечивает взаимодействие в таких случаях.
Подразделением (apartment) называется совокупность потоков, между которыми интерфейсный указатель может передаваться без маршалинга. При передаче интерфейсного указателя между подразделениями необходим маршалинг. Каждый поток процесса, который вызывает CoInitialize или CoInitializeEx(NULL, COINIT_APARTMENTTHREADED) доставка окон затем занимается получением доставка окон доставкой оконных сообщений, является подразделением в совместной модели (совместным подразделением). Все остальные потоки процесса, которые вызывают CoInitializeEx(NULL, COINIT_MULTITHREADED), совместно образуют подразделение свободной модели (свободное подразделение). Потоки свободного подразделения не обязаны получать доставка окон доставлять сообщения. Процесс, работающий с OLE, представляет собой набор подразделений хотя бы с одним свободным подразделением доставка окон с произвольным количеством совместных подразделений.
В совместной модели клиент или сервер содержит одно или несколько свободных подразделений доставка окон не имеет ни одного свободного подразделения. Однопоточная модель является вырожденным случаем совместной модели, в которой присутствует лишь одно совместное подразделение. В свободной модели клиент или сервер содержит одно свободное подразделение (из одного или нескольких потоков) доставка окон не имеет ни одного совместного. В смешанной модели клиент или сервер имеет одно свободное подразделение доставка окон произвольное количество совместных подразделений.
Термины совместная модель доставка окон свободная модель описывают способ «доставки» интерфейсных вызовов к объекту.
1.3 Совместная модель
В клиенте или сервере совместной модели подразделение представляет собой отдельный поток, который вызвал CoInitialize или CoInitializeEx(NULL, COINIT_ APARTMENTTHREADED) доставка окон который занимается получением доставка окон доставкой оконных сообщений, потому что в этой модели OLE доставляет обращения к объекту посредством оконных сообщений (см. статью Q136885 KnowledgeBase).
1.4 Серверы, поддерживающие совместную модель
В совместной модели OLE синхронизирует обращения к объекту по аналогии с синхронизацией сообщений, посылаемых окну. Обращения передаются с оконными сообщениями доставка окон доставляются потоку, который создал объект (такой поток называется потоком объекта, или подразделением объекта). Соответственно, чтобы получать такие обращения, подразделение объекта должно организовать прием сообщений функциями Get/Peek Message доставка окон DispatchMessage. В каждом подразделении OLE создает скрытое окно, которое получает обращения к объекту в виде оконных сообщений. Когда подразделение объекта получает доставка окон доставляет сообщение, оно будет передано скрытому окну, после чего оконная процедура вызывает нужный интерфейсный метод объекта.
Когда к объекту обращаются сразу несколько клиентов, обращения помещаются в очередь сообщений, доставка окон объект будет получать их по мере выборки доставка окон доставки сообщений подразделением. Поскольку обращения синхронизируются OLE доставка окон доставляются только через подразделение объекта, интерфейсная реализация объекта может не заботиться о синхронизации. Если один из интерфейсных методов объекта сам получает доставка окон доставляет сообщения, то обработка предыдущего обращения может быть прервана, доставка окон объект получит следующее обращение (из того же подразделения). OLE доставка окон не запрещает повторный вход в поток, но при этом обеспечивает потоковую безопасность. Ситуация отчасти напоминает повторный вход в оконную процедуру, если последняя во время обработки сообщения занимается получением доставка окон доставкой сообщений.
1.5 Клиенты, поддерживающие совместную модель
Клиент, использующий совместную модель, должен выполнять маршалинг интерфейсов объекта между подразделениями при помощи функций CoMarshalInterThreadInterfaceInStream доставка окон CoGetInterfaceAndReleaseStream. Например, если Подразделение 1 клиента имеет интерфейсный указатель, доставка окон Подразделение 2 желает им воспользоваться, то Подразделение 1 должно выполнить маршалинг интерфейса функцией CoMarshalInterThreadInterfaceInStream. Возвращаемый этой функцией поток является безопасным. Его необходимо сохранить в переменной, доступной для Подразделения 2. Подразделение 2 передает этот поток функции CoGetInterfaceAndReleaseStream, чтобы выполнить демаршалинг интерфейса, доставка окон получает обратно указатель на посредника (proxy), через которого оно может работать с интерфейсом. Главным подразделением называется поток, в котором функция CoInitialize была вызвана впервые. Главное подразделение должно существовать до тех пор, пока клиент не завершит всю работу с OLE (потому что некоторые внутрипроцессные объекты загружаются в главном подразделении, как описано ниже).
1.6 Свободная модель
В клиентах или серверах свободной модели подразделение представляет собой совокупность всех потоков процесса, в которых была вызвана функция CoInitializeEx(NULL, COINIT_MULTITHREADED). Потоки не обязаны получать доставка окон доставлять сообщения, потому что в этой модели OLE не использует оконных сообщений.
1.7 Серверы, поддерживающие свободную модель
В свободной модели OLE не синхронизирует обращения к объекту. Сразу несколько клиентов могут одновременно обратиться к объекту свободной модели из различных потоков, доставка окон объект должен сам обеспечить синхронизацию при помощи таких механизмов, как события, mutex, семафоры доставка окон т. д. Внепроцессные объекты свободной модели могут получать одновременные обращения от нескольких клиентов через пул созданных OLE потоков, принадлежащих процессу объекта. Внутрипроцессные объекты свободной модели могут получать обращения непосредственно от нескольких потоков клиента.
1.8 Клиенты, поддерживающие свободную модель
Клиент, использующий свободную модель, не обязан выполнять маршалинг интерфейсных указателей объекта между своими потоками. Когда поток клиента обращается к внепроцессному объекту, его работа приостанавливается до завершения обращения. В свободной модели не используются фильтры сообщений (IMessageFilter).
1.9 Смешанная модель
Клиент или сервер, поддерживающий смешанную модель, имеет одно свободное подразделение доставка окон одно или несколько совместных подразделений. При передаче интерфейсных указателей между подразделениями должен происходить маршалинг, однако внутри подразделения ими можно пользоваться доставка окон без маршалинга. Обращения к объектам в совместных подразделениях синхронизируются средствами OLE. Обращения к объектам в свободном подразделении OLE не синхронизирует.
1.10 Выбор потоковой модели
Компонент может поддерживать совместную или свободную модель, или же их комбинацию в виде смешанной модели. Например, объект, которому приходится осуществлять много операций ввода/вывода, может выбрать поддержку свободной модели, чтобы обеспечить минимальное время отклика на запросы клиентов за счет обработки интерфейсных выводов в периоды задержки ввода/вывода. С другой стороны, объект, которому приходится взаимодействовать с пользователем, может поддерживать совместную модель, чтобы синхронизировать поступающие обращения OLE со своими оконными операциями. Совместная модель поддерживается проще, потому что вся синхронизация выполняется OLE. Свободная модель вызывает больше сложностей из-за того, что объект должен организовать синхронизацию доставка окон хранение локальной информации потоков, однако она улучшает время отклика, поскольку синхронизация выполняется на уровне меньших участков кода, доставка окон не целых интерфейсных обращений, как это делает OLE.
1.11 Пометка поддерживаемой потоковой модели
Поток поддерживает свободную модель, если он вызывает функцию CoInitializeEx(NULL, COINIT_MULTITHREADED). Если была вызвана функция CoInitialize или CoInitializeEx(NULL, COINIT_APARTMENTTHREADED), поддерживается совместная модель.
Внутрипроцессный сервер не вызывает CoInitialize/CoInitializeEx, он должен указать свою потоковую модель при помощи реестра. Для этой цели используется именованное значение ThreadingModel ключа InprocServer32, значения которого интерпретируются следующим образом:
Значение ThreadingModel отсутствует: поддерживается однопоточная модель.
ThreadingModel=Apartment: поддерживается совместная модель.
ThreadingModel=Both: поддерживается совместная доставка окон свободная модель.
ThreadingModel=Free: поддерживается только свободная модель.
Обратите внимание на то, что ThreadingModel является именованным значением, доставка окон не подключом, как ошибочно утверждалось в ранних версиях документации по Win32.
Потоковые модели во внутрипроцессных серверах рассматриваются ниже. В настоящее время внутрипроцессные серверы не поддерживают смешанную модель.
Внепроцессные серверы не используют значения ThreadingModel. Вместо этого они вызывают CoInitialize или CoInitializeEx.
1.12 Когда клиент доставка окон объект пользуются различными потоковыми моделями
Взаимодействие клиента с внепроцессным объектом происходит достаточно просто, даже если они пользуются различными потоковыми моделями, потому что клиент доставка окон объект принадлежат различным процессам, доставка окон все обращения клиента к объекту доставляются средствами OLE. Поскольку OLE является посредником между клиентом доставка окон сервером, появляется возможность предоставить код для взаимодействия разных потоковых моделей. Например, если однопоточный объект вызывается одновременно несколькими клиентами со свободной моделью, OLE синхронизирует вызовы, помещая оконные сообщения в очередь сообщений сервера. Подразделение объекта последовательно получает обращения от клиентов, поочередно извлекая доставка окон обрабатывая сообщения. При взаимодействии клиентов с внепроцессными объектами возможны любые сочетания потоковых моделей.
Взаимодействие клиента с внутрипроцессным объектом, использующим другую потоковую модель, происходит более сложно. Хотя сервер доставка окон является внутрипроцессным, в некоторых случаях OLE приходится вмешиваться в общение клиента с сервером. Например, внутрипроцессный объект, поддерживающий однопоточную модель, может одновременно получить несколько вызовов от нескольких потоков клиента. OLE не может позволить потокам клиента напрямую обращаться к интерфейсу объекта, поскольку объект на это не рассчитан. Вместо этого OLE обеспечивает синхронизацию обращений доставка окон их поступление только от того потока клиента, в котором был создан объект. Для этого объект создается в главном подразделении клиента доставка окон выдвигается требование о том, чтобы все остальные подразделения клиента работали с объектом через посредника. При взаимодействии клиентов с внутрипроцессными объектами тоже возможны любые сочетания потоковых моделей.
1.13 Потоковые модели во внутрипроцессных серверах
Существуют четыре категории внутрипроцессных серверов. Каждая из них может использоваться любым клиентом OLE, независимо от его потоковой модели. О том, как обеспечивается взаимодействие с ними, подробнее рассказано в следующем разделе.
1.14 Внутрипроцессный сервер с однопоточной моделью (одно подразделение в совместной модели)
Обращения к предоставляемому сервером объекту должны осуществляться из того же подразделения клиента, в котором он был создан. Кроме того, сервер ожидает, что все его точки входа (например, DllGetClassObject доставка окон DllCanUnloadNow) доставка окон глобальные данные всегда будут использоваться тем же подразделением. К этой категории относятся серверы, существовавшие еще до появления совместной доставка окон свободной модели. Такие серверы не рассчитаны на одновременные обращения со стороны нескольких потоков, поэтому OLE создает все объекты, предоставляемые сервером, в главном подразделении клиента, доставка окон это подразделение доставляет обращение ко всем объектам. Другие подразделения клиента работают с объектом через посредника. Обращения от других подразделений поступают от посредника в заглушку главного подразделения (межпотоковый маршалинг), доставка окон затем — в объект. Такая разновидность маршалинга позволяет OLE синхронизировать обращения к объекту, причем все обращения доставляются тем подразделением, где был создан объект. Межпотоковый маршалинг работает относительно медленно, поэтому рекомендуется переписать такие серверы заново доставка окон предусмотреть в них поддержку подразделений совместной модели (тип 2).
1.15 Внутрипроцессный сервер с совместной моделью(несколько подразделений в совместной модели)
Обращения к предоставляемому сервером объекту должны осуществляться из того же подразделения клиента, в котором он был создан. В этом отношении он ничем не отличается от объекта, предоставленного однопоточным внутрипроцессным сервером. Тем не менее предоставляемые сервером объекты могут создаваться в нескольких подразделениях клиента, поэтому точки входа сервера (например, DllGetClassObject доставка окон DllCanUnloadNow) должны проектироваться для многопоточного использования. Например, если два подразделения клиента одновременно создадут два экземпляра внутрипроцессного объекта, функция DllGetClassObject может быть вызвана одновременно двумя подразделениями. Функция DllCanUnloadNow должна быть написана так, чтобы сервер нельзя было выгрузить во время выполнения.
Если сервер предоставляет лишь один экземпляр фабрики класса для создания всех объектов, реализация фабрики класса также должна быть спроектирована для использования несколькими потоками, поскольку к ней будут обращаться несколько подразделений клиента. Если сервер создает новый экземпляр фабрики класса при каждом вызове DllGetClassObject, можно не заботиться о потоковой безопасности фабрики класса.
Объекты, создаваемые фабрикой класса, не обязаны быть потоково-безопасными. После того как объект будет создан потоком, все обращения к нему производятся только через этот поток, доставка окон все обращения к объекту синхронизируются OLE. Все остальные подразделения клиента должны обращаться к объекту через посредника. Посредники создаются, когда клиент выполняет маршалинг интерфейса между своими подразделениями.
Любое подразделение клиента, создавшее объект, получает прямой указатель на него. В этом отношении оно отличается от однопоточных внутрипроцессных объектов, где прямой указатель на объект получает только главное подразделение клиента, доставка окон все остальные подразделения, также создающие объекты, должны обращаться к ним через посредника. Межпотоковый маршалинг работает относительно медленно, поэтому переход от однопоточной модели к совместной позволяет добиться существенного выигрыша в скорости.
1.16 Внутрипроцессный сервер с совместной доставка окон свободной моделью
Объекты, предоставляемые такими серверами, самостоятельно организуют синхронизацию доставка окон допускают одновременное обращение со стороны нескольких подразделений клиента. Кроме того, такой объект может создаваться доставка окон использоваться напрямую (без посредника) в совместных или свободных подразделениях клиента. Поскольку в совместной модели объекты могут использоваться непосредственно, сервер должен выполнять маршалинг интерфейсов объектов (возможно, от других серверов) между потоками, гарантируя тем самым, что доступ к объекту будет происходить в соответствии с потоковой моделью.
Поскольку объект также поддерживает свободную модель, он может повысить свою производительность за счет агрегирования с маршалером свободной модели, предоставляемым функцией CoCreateFreeThreadedMarshaler. Это позволит разным подразделениями клиента совместной модели напрямую обращаться к объекту, не пользуясь услугами посредника, когда клиент выполняет маршалинг интерфейса объекта для другого подразделения. Например, клиент совместной модели может создать внутрипроцессный объект в Подразделении 1 доставка окон выполнять его маршалинг для Подразделения 2. Если объект не будет агрегирован с маршалером свободной модели, Подразделение 2 будет работать с объектом через посредника. В противном случае маршалер свободной модели предоставит Подразделению 2 прямой указатель на объект.
1.17 Внутрипроцессный сервер с поддержкой только свободной модели
Объекты, предоставляемые таким сервером, самостоятельно организуют синхронизацию доставка окон допускают одновременное обращение со стороны нескольких подразделений клиента. Сервер не выполняет маршалинг интерфейсов (возможно, от других серверов) между потоками, поэтому сервер может создаваться доставка окон использоваться напрямую (без посредника) только свободными подразделениями клиента. Создавшие его совместные подразделения должны работать через посредника (подробнее см. в следующем разделе).
1.18 Взаимодействие клиента доставка окон внутрипроцессного объекта с различными потоковыми моделями
При взаимодействии клиента с внутрипроцесссным объектом допускаются любые сочетания потоковых моделей.
OLE позволяет клиентам совместной модели взаимодействовать с однопоточными внутрипроцессными объектами, при этом объект создается в главном подразделении клиента доставка окон выполняется его маршалинг для подразделения клиента, вызвавшего CoCreateInstance.
Если свободное подразделение клиента создает внутрипроцессный сервер совместной модели, OLE запускает в клиенте совместный «обслуживающий» поток. Этот обслуживающий поток создает объект, доставка окон интерфейсный указатель будет через маршалинг возвращен свободному подразделению. Аналогично, когда совместное подразделение создает свободный внутрипроцессный сервер, OLE запускает в клиенте свободный «обслуживающий» поток, в котором будет создан интерфейс с последующим маршалингом его совместному подразделению. Взаимодействие однопоточной модели со свободной организовано похожим образом, поскольку однопоточная модель представляет собой вырожденный случай совместной модели.
1.19 Потоковые модели во внепроцессных серверах
Существуют четыре категории внепроцессных серверов. Все они могут использоваться любым клиентом OLE, независимо от используемой им потоковой модели.
1.20 Однопоточный сервер
Сервер работает с OLE только в одном подразделении. Поступающие обращения синхронизируются средствами OLE доставка окон доставляются подразделению, в котором был создан объект. Объект доставка окон фабрика класса не обязаны осуществлять синхронизацию.
1.21 Совместный сервер
Сервер работает с OLE в нескольких подразделениях. Поступающие обращения синхронизируются средствами OLE доставка окон доставляются подразделению, в котором был создан объект. Объект доставка окон фабрика класса не обязаны осуществлять синхронизацию. Сервер должен пользоваться функциями CoMarshalInterThreadInterfaceInStream доставка окон CoGetInterfaceAndReleaseStream для выполнения маршалинга интерфейсов между подразделениями.
1.22 Свободный сервер
Обращения не синхронизируются OLE. OLE создает в процессе сервера пул потоков, доставка окон обращение от клиента может быть доставлено любым из этих потоков. Потоки не обязаны получать доставка окон доставлять сообщения. Объект доставка окон фабрика класса обязаны организовать синхронизацию. Сервер не обязан выполнять маршалинг интерфейсных указателей между потоками.
1.23 Смешанный сервер
Подробности см. в предыдущем разделе «Смешанная модель».
1.24 Потоковые модели в клиентах
Клиенты делятся на четыре категории в соответствии с используемой в них потоковой моделью: однопоточные, совместные, свободные доставка окон смешанные.
1.25 Однопоточный клиент
Клиент работает с OLE только в одном подразделении.
1.26 Совместный клиент
Клиент работает с OLE в нескольких подразделениях совместной модели. Клиент всегда выполняет маршалинг интерфейсов между подразделениями при помощи функций CoMarshalInterThreadInterfaceInStream доставка окон CoGetInterfaceAndReleaseStream.
Две эти категории могут пользоваться IMessageFilter при выполнении синхронных обращений к OLE.
1.27 Свободный клиент
Клиент может работать с OLE в нескольких потоках. Все потоки принадлежат одному свободному подразделению. Клиент не выполняет маршалинг интерфейсных указателей между потоками доставка окон не пользуется IMessageFilter. При обращении через OLE к внепроцессному серверу поток клиента приостанавливается, доставка окон при выходе из него — возобновляет работу.
1.28 Смешанный клиент
Любой клиент может создать любой внутри- или внепроцессный сервер, независимо от потоковой модели сервера. Тем не менее внутрипроцессный сервер должен предоставить код маршалинга для любого нестандартного интерфейса, реализуемого им, если он хочет обеспечить нормальное взаимодействие потоковых моделей, при котором маршалинг интерфейсов между подразделениями клиента выполняется средствами OLE.
Подробности см. в разделе «Смешанная модель».
ПОМОЩЬ
Оплата доставка окон доставка
Вопросы доставка окон ответы
Карта сайта
Обратная связь
ПОДПИСКА
Хотите быть в курсе событий?
Подпишитесь на еженедельную рассылку Издательского дома «Питер»
о новинках, акциях, скидках. подробнее
ЗАКАЗ КНИГ
ПО ТЕЛЕФОНУ
Доставка по России доставка окон всему миру:
почтой — (812) 703-73-74
Доставка по Москве:
курьером — (495) 234-38-15
Доставка по Петербургу:
курьером — (812) 703-76-21
ГЛАС ЧИТАТЕЛЯ
отзыв на книгу:
Самоучитель работы на компьютере. 10-е изд.
Эта книга просто клад для начинающих работать на компьютере. Я пользуюсь книгами только этого автора, ибо там все написано просто доставка окон с юмором.
Сергей
Главная |
Новинки |
Новости |
Рейтинг продаж |
Файлы |
Клуб Профессионал |
Партнерская программа
Авторские права охраняются.
Воспроизведение материалов или их частей в любом виде без письменного разрешения запрещено!
© 1997-2008, Издательский дом «Питер»
Санкт-Петербург
Б. Сампсониевский пр., 29а
тел.: (812) 703-73-74,
(812) 703-73-73
e-mail: postbook@piter.com
sales@piter.com
http://www.piter.com
разделы
здание лмк
катетер
перегородка сантехкабин
вызов водитель
snr roulements
планирование день
дермато-венеролог
купить элеваторный узел
зеркало багуа
клеить 88 люкс
доставка окон