Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы к лекциям COM.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
880.64 Кб
Скачать

8.4. Реализация com

Многие функции для работы с технологией COM представлены в библиотеке ole32.dll (ole2.dll), для их использования необходимо:

  1. Проверить, совпадает ли функция с библиотекой COM;

  2. Инициализировать библиотеку COM;

  3. Освободить ресурсы библиотеки, когда она больше не понадобится.

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

CoInitialize();

CoUninitialize();

9. Управление потоками com

9.1. Основные определения

Для начала, необходимо напомнить, какие типы серверов COM могут быть:

  1. Сервер в процессе (in-proc);

  2. Локальный (local);

  3. Удаленный (remote).

Первый тип серверов реализуется с помощью динамической библиотеки dll. Второй и третий типы могут быть реализованы в виде исполняемых файлов exe.

Локальный означает то, что EXE-модуль сервера будет запускаться на той же машине, что и клиент. Точно также как и in-proc, с единственным различием – in-proc DLL будет загружена в адресное пространство клиента, в то время как local будет запущен отдельным процессом.

Удаленный - это исполняемый модуль, запускаемый на другой машине, следовательно, для его работы необходимо указать имя хоста, на котором предполагается запустить сервер.

При использовании in-proc серверов проблем не возникает с многопоточностью, в отличие от использования различных exe-модулей.

Многопоточные приложения имеют два основных подводных камня: взаимоблокировки (deadlocks) и гонки (races).

Взаимоблокировка происходит, когда один поток ожидает от другого каких-то действий, а тот, в свою очередь, ждет некоторых действий от первого.

Состояние гонок возникает, если один поток заканчивает свою работу раньше, чем другой, от которого он зависит. Из-за этого первый поток получает мусор вместо результатов, ибо второй еще не предоставил верных.

COM помогает предотвратить взаимоблокировки вызовов объектов. Существуют и некоторые функции, созданные для предотвращения состояния гонок во внепроцессных серверах.

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

Стоит сказать и том, что многопоточность сама по себе не гарантирует лучшей производительности. Поскольку создание и синхронизация потоков – сложные задачи, использование многопоточности часто порождает проблемы производительности. Несколько потоков следует использовать только в том случае, когда вы твердо знаете, что делаете.

Самый простой путь понять архитектуру потоков, принятую в COM – это представить, что все COM-объекты в процессе разделены на группы, называемые апартаментами (apartments). COM-объекты всегда живут в одном апартаменте, в том смысле, что их методы могут быть легально вызваны только потоком, принадлежащим этому апартаменту. Любой другой поток, желающий вызвать объект, должен делать это через proxy.

Существует два типа апартаментов: однопоточные апартаменты (single-threaded apartments, STA) и многопоточные апартаменты (multi-threaded apartments, MTA).