при работе нескольких приложений одновременно обращение к процессору происходит

При работе нескольких приложений одновременно обращение к процессору происходит

Принципы обмена информацией между приложениями Windows

Совместная работа нескольких приложений

Система Windows исходно задумывалась как многозадачная. Это означает, что в ней одновременно могут работать несколько задач. Это действительно так. Например, на ПК с процессором Pentium/233 и достаточным объемом ОЗУ (64 Мбайт) можно запустить интенсивную вычислительную задачу и одновременно продолжать работу в редакторе Word или электронной таблице Excel, ожидая результаты расчетов, выполняющихся в фоновом режиме. А в системе Windows NT такие возможности значительно расширены и к ним добавлены специальные средства управления выполняющимися программами.

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

Программы, обменивающиеся информацией, как правило, не равноправны. Одна из них выступает в роли сервера, рассылающего обработанную информацию (по аналогии с сервером баз данных), другая (или несколько других) — в роли клиента (по аналогии с клиентской программой, получающей наборы данных по запросу к СУБД). Однако в большинстве случаев приложения Windows могут работать и как серверы, и как клиенты.

В Windows имеется несколько технологий, позволяющих организовать эффективное взаимодействие группы приложений. Еще в первых 16-разрядных версиях Windows была реализована технология DDE (Dynamic Data Exchange, динамический обмен данными). С ее помощью программа-сервер может обмениваться информацией (текстовыми строками) с программами-клиентами, подключенными к этому серверу с помощью протокола DDE, Абсолютное большинство приложений корпорации Microsoft поддерживают этот протокол, что позволяет обращаться к ним из других программ, передавать и получать информацию.

В системе Delphi 7 для поддержки технологии DDE созданы четыре компонента, расположенные на панели System (Системные).

TDdeClientConv Устанавливает связь с серверам DDE

TDdeClientltem Конкретный объект, содержимое которого передается (или принимается) за один сеанс связи с сервером DDE. Обеспечивает транэакционную работу по обмену информацией

TDdeServerConv Сервер DDE

TDdeServerltem Объект стороны сервера, содержимое которого предназначено для обмена

Компонент TDdetLientConv обладает двумя важнейшими свойствами, лежащими в основе протокола DDE. Свойство DdeService описывает серверное приложение, с которым устанавливается связь, а свойство DdeTopic — так называемый «топик» (topic), хараЕстеризует имя серверного объекта, непосредственно участвующего в обмене информацией.

С помощью компонентов TDdeServerConv/TDdeServerltem можно включить в свою программу богатые возможности обмена данными, хотя для этих целей компания Microsoft предлагает значительно более мощную и гибкую технологию OLE. Тем не менее поддержка механизма DDE в продуктах корпорации сохраняется, и в некоторых случаях использовать этот протокол обмена значительно проще, чем вес остальные.

Сервером DDE является, например, электронная таблица Excel. Написав несколько строк кода, можно организовать простой обмен содержимым между программой и ячейками страниц Excel 97.

Разместим на форме текстовое поле, две кнопки (Поспатьи Принять) — и компонентTDdeQientConv.

Основная задача при использовании компонентов DDE — установить связь между сервером

и клиентом и, вообще, выяснить, поддерживает ли некоторое приложение этот протокол. Проще

всего сделать это так. Запустите программу-сервер (в нашем случае — Excel 97), выберите

произвольную ячейку и скопируйте ее содержимое в буфер обмена Windows. Затем перейдите к Инспектору объектов и для любого из свойств DdeService/DdeTopIc вызовите редактор

связи с сервером DDE Info, щелкнув на кнопке вызова в соответствующей строке Инспектора.

После щелчка на этой кнопке в поля DdeServke/QdeTopic будут внесены названия сервера (Excel) и объекта — первого листа таблицы [Книга1]Лист1, если в программе Excel был открыт новый файл. Теперь надо подтвердить связь щелчком на кнопке ОК.

Обмен данными может происходить в обе стороны: как в сторону электронной таблицы, так и от нее к клиентскому приложению. Это приложение управляет работой сервера, отдавая ему соответствующие команды.

Чтобы послать данные серверной программе, используется следующий метод,

function PokeData (Item; string,- Data: PChar) : Boolean;

Первый параметр описывает принимающий объект стороны сервера (этот объект обычно выделен или имеет фокус). Для некоторых программ можно указать принимающий элемент явно. В частности, для программы Excel можно указать номер ячейки в формате ≪RnCm≫. Здесь где п — номер строки, начиная с 1, a m — номер столбца, начиная с 1. Например, ячейка с координатами (5,12) обозначается как R5C12.

Второй параметр — передаваемая строка в формате PChar.

Сделаем так, чтобы по щелчку на кнопке Послать с помощью этого метода в ячейку электронной таблицы с координатами (2,3) (программа Excel должна быть запущена заранее) записывалось содержимое поля Editl нашей программы (рис. 8.1):

procedure TForml.ButtonlClick(Sender: TObjecti;

Puc. 8.1. Содержимое ячейки электронной таблицы передано из внешнего приложения

Чтобы принять информацию от программы-сервера, надо воспользоваться следующим методом.

function RequestData(const Item: string]: PChar;

Единственный параметр — объект сервера, содержащий принимаемые данные (в нашем случае — ячейка таблицы).

Функция возвращает в формате PChar указатель на строку, которая хранит данные, полученные от сервера.

Для отображения в поле Editl нашей программы содержимого ячейки (1,1) надо сформировав следующий обработчик щелчка на кнопке Принять.

procedure TForml.Button2ClickfSender: TObject);

var FromExcel: PChar;

Как видим, использование технологии DDE не вызывает особых сложностей.

С помощью компонентов TDdeServerConv и TOdeServerltem можно расширить возможности своего приложения, чтобы оно также было способно работать как сервер DDE. К недостаткам технологии D/M: надо отнести отсутствие единого подхода к работе с различными серверами DDE. Например, чтобы узнать, как обращаться к ячейкам электронной таблицы Excel, надо основательно покопаться в документации. То же относится и ко многим другим стандартным программам.

Технология Object Linking and Embedding (Связывание и внедрение объектов) обладает значительно большими возможностями, нежели механизм DDE. Типичный пример использования этой технологии — добавление рисунка в документ текстового процессора Word (Вставка > Рисунок > Из файла). Это действие можно выполнить двумя способами.

1. В ходе выбора рисунка в диалоговом окне устанавливается флажок Связать с файлом. В этом случае в документ физически добавляется только ссылка на рисунок (место его хранения и используемый графический формат). При внесении изменений в исходный файл с рисунком эти изменения отображаются в документе, а если этот файл удалить, то программа Wordue сможет ничего отобразить. Такой способ объединения двух объектов называется связыванием,

2. Если флажок Связать с файлом сброшен, то рисунок копируется из исходного файла и вставляется в документ. Теперь, если оригинальный файл изменен или удален, копия рисунка останется в документе в неизменном виде. Такой подход называется внедрением.

В случае связывания объем документа Word увеличивается незначительно, но требуется контролировать наличие файла с рисунком и следить за его изменениями.

В случае внедрения существенно увеличивается объем документа, так как изображение хранится внутри него.

Объект, который встраивается в документ или связывается с ним, называется контейнером OLE (OLE Container). В нашем случае это рисунок. В системе Delphi 7 на панели System (Системные) имеется компонент TDleContainer, позволяющий встраивать объекты в программу или связывать их с ней.

Технология OLE обладает и множеством других возможностей. В частности, это автоматизация OLE (OLE Automation), позволяющая программно управлять другими приложениями, вызывая их методы, доступные через интерфейс OLE. При этом, конечно, требуется, чтобы приложение поддерживало автоматизацию OLE.

Технология OLE расширяет технологию DDE. Если ранее можно было только обмениваться данными и понятия «объект» не существовало, то в рамках технологии

OLE программист работает с программами и данными как с полноценными объектами, обладающими не только свойствами, но и методами, к которым можно обращаться.

Практически все офисные приложения Windows поддерживают автоматизацию OLE. Например, к таковым относится браузер Internet Explorer, работой которого несложно управлять программно.

Основные недостатки при использовании технологии OLE — необходимость знать (как и в случае DDE) описание доступных свойств и методов обрабатываемых объектов, которые в браузере и редакторе отличаются, и отсутствие общего программного интерфейса.

Эта проблема была полностью снята в технологии COM (Component Object Model, объектная модель компонента), основанной на технологии OLE. Технология СОМ подробно рассматривается в последующих главах.

Однако вернемся к объектам OLE и посмотрим, как можно использовать компонент TOleContainer. После размещения компонента на форме в его контекстном меню доступны, в частности, два пункта: Insert Object (Вставить объект) и Paste Special (Специальная вставка). С помощью первого пункта определяется объекг OLE, который размещается на форме (рис. 8.2).

В списке указываются все типы объектов OLE, которые зарегистрированы в конкретной версии Windows. Например, если выбрать пункт Диаграмма Microsoft Excel (при условии, что в системе установлена электронная таблица Excel), то в окне компонента отображается некая начальная диаграмма (рис. 8.3).

Если дважды щелкнуть на ней, то в рамках границ компонента TOleContainer запускается программа Excel. С ее помощью можно выполнить редактирование этой диаграммы (рис. 8.4).

Можно также вставить готовый объект из файла. Тогда в диалоговом окне вставки объекта надо установить переключатель Создать из файла и указать нужный файл. Флажок Связь определяет режим добавления документа в программу (связывание или внедрение).

Динамически подключаемые библиотеки (DLL)

Создание библиотеки DLL

Допустим, требуется создать библиотеку, в которой будет находиться функция суммирования двух чисел.

function Sum(X,Y: integer): integer;

Выполним команду File >• New > Other >• DLL Wizard (Файл >• Создать > Другое >• Мастер DLL). При этом создается пустая заготовка библиотеки. Текст модуля начинается не со слова unit, а со слова library. Добавим в нее описание функции Sum, а в конец модуля библиотеки — ключевое слово exports, после которого приводится список экспортируемых функций — функций данной библиотеки, которые доступны другим приложениям.

ВНИМАНИЕ Подпрограммы, названии которых не указаны а директиве exports, не могут вызываться из других программ и используются только внутри программы.

Целиком модуль запишется следующим образом,

function Sum(X,Y: integer): integer;

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

function Sum(X,Y: integer): integer;

Рис. 8.5. Форма для приложения, которое будет обращаться к внешней библиотеке DLL

Обработчик щелчка на кнопке запишется следующим образом.

procedure TForml.ButtonlClick(Sender: TObject>;

Теперь можно запустить приложение (предварительно надо откомпилировать библиотеку Projectl.dll). После щелчка на кнопке выполняется суммирование введенных чисел с помощью функции, программный код которой хранится в динамической

Добавление ресурсов в библиотеку

Сделаем активным проект Projectl.dll и выполним команду File >• New x Form (Файл > Создать > Форма). В текущем проекте появится новая форма (рис. 8.7). Добавим на нее одну кнопку, а обработчик нажатия сделаем таким.

procedure ShowMyFormfAOwner: TComponent);

Эта процедура должна иметь параметр типа TComponent, необходимый для конструктора формы. Включим созданную процедуру в список экспорта.

exports Sum, ShowMyForm;

Далее переключимся на проект Project2.exe и укажем новую импортируемую процедуру.

procedure ShowMyFormfAOwner: TComponent);

Добавим на форму еще одну кнопку и создадим такой обработчик щелчка.

procedure TForml.Button2Click(Sender: TObject];

В предыдущей главе была рассмотрена возможность загрузки и выполнения функций из внешних библиотек. Теперь рассмотрим обратный случай — «одновременное» выполнение нескольких функций в одной программе.

Слово ≪одновременное≫ не зря взято в кавычки. В реальности, параллельно выполнять несколько программ можно, очевидно, только при наличии у компьютера двух и более процессоров. Однако система Windows позволяет имитировать такую одновременную работу: каждой программе операционная система выделяет небольшой квант времени (несколько миллисекунд), в течение которого выполняется данная программа, а затем происходит переключение к следующей программе. Так как квант времени очень мал, для человека такое мгновенное переключение незаметно.

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

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

а в фоновом режиме в это время выполняется расчет баланса.

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

ЗАМЕЧАНИЕ Корпороция Borland не рекомендует создавать в одной программе более 16 процессов, если эта программа работает но однопроцессорном компьютере.

Создание многопоточного приложения

Далее мы рассмотрим пример, в котором в рамках программы, содержащей формы с двумя областями рисования (TPaintBox), запускаются два потока, каждый из которых выполняет рисование в своей области и со своей скоростью.

Создадим новое приложение командой File >• New > Application (Файл >• Создать > Приложение). Подготовим форму с двумя областями рисования TPaintBox размером 100×100 пикселов. Разместим также на форме кнопку, по щелчку на которой запускаются потоки (рис. 8.9).

Добавим в проект класс-поток командой File > New > Other > Thread Object (Файл >• Создать >• Другое > Потоковый объект). В диалоговом окне ввода названия класса укажем TMyThread. Этот класс будет наследником базового класса-потока TThread. Возникнет файл с пустым описанием этого класса.

Перейдем к модулю главной формы и опишем в классе TForml новый метод CPaint, который получит в качестве параметра холст и нарисует на нем квадрат размером 10×10 пикселов. Место расположения квадрата и его цвет выбираются случайным образом.

На деталях реализации этой процедуры останавливаться не станем.

Добавим еще два метода (процедуры без параметров), которые будут обращаться к процедуре CPaint для вывода квадрата либо на холст объекта PaintBoxl, либо на холст объекта PaintBox2.

Эти процедуры необходимы, чтобы вызывать их из класса-потока, причем специальным образом. Дело в том, что, когда методы классов Delphi 7 (в нашем случае —метод Rectangle) одновременно вызываются из нескольких потоков, это может приводить к самым неожиданным конфликтам между потоками. Например, проблемы могут быть связаны со слишком быстрым чередованием обработки процесса вывода на экран, когда системе требуется обрабатывать объекты классов

Процесса вывода на экран, когда системе требуется обрабатывать объекты классов TBrush, ТРеп.

Эти классы давно известны как источники ошибок, вызванных неаккуратным обращением с ними. Поэтому в классе TThread имеется метод гарантированно безопасного выполнения таких методов. Этот метод выполняет синхронизацию работы всех потоков.

type TThreadMethod = procedure of object;

В качестве параметра он получает название метода без параметров. Для этого нам и понадобилось создать процедуры Paintl и Paint2. А как определить внутри потока, какой из этих методов надо вызывать? Добавим в класс TMyThread переменную Boxl.

При создании экземпляра потока занесем в эту переменную значение True, если надо вызывать метод Paintl. Вся логика работы потока описывается в его основном методе.

Нам надо переопределить этот метод следующим образом.

while not Terminated do

if Boxl then Synchronise (Forrnl.Paintl)

Свойство класса Terminated автоматически примет значение True, когда программа получит команду на завершение. В зависимости от значения переменной Boxl выполнится отрисовка одного квадрата (вызов соответствующего метода класса TForml),после чего продолжится цикл произвольной длительности.

Теперь надо добавить в описание класса TForm 1 две новые переменные — два будущих

Tl. Priority := tpLower;

Поток создается с помощью конструктора Create, который имеет один параметр.

Он имеет значение True, если поток начинает работу после вызова метода Resume,

В противном случае (False) поток начнет работу сразу же после создания.

Далее задаются значения переменной Boxl и свойства Priority — приоритета выполнения потока. Приоритет определяет, как часто Windows выделяет процессу кванты времени, то есть фактически задает быстродействие этого процесса.

Свойство Priority имеет тип TThreadPriority и может принимать одно из следующих значений.

Таблица 8.2. Значения свойства Priority

Значение Приоритет потока

tpldle Поток выполняется, только когда системе Windows больше нечего делать

tpLowest Приоритет на два пункта ниже нормального

tpLower Приоритет на один пункт ниже нормального

tpNormal Нормальный приоритет

tpHigher Приоритет на один пункт выше нормального

tpHighest Приоритет на два пункта выше нормального

tpTimeCritical Максимальный приоритет

В раздел interface модуля Unitl нужно добавить ссылку на модуль Unit2, где описан класс

TMyThread, а в раздел implementation модуля Unit? — ссылку на модуль Unitl. Программу

можно откомпилировать и запустить. После щелчка на кнопке начнется заполнение двух

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

исходить заметно медленнее.

Использование объектов СОМ

Что такое технология СОМ

Одна из важных составляющих .NET — служба Web Services, реализация которой уже отдельно осуществлена корпорацией Microsoft. Создавать приложения Web Services можно и с помощью Delphi 7 — этому вопросу посвящен соответствующий раздел, и хочется порекомендовать: обратите на Web Services самое серьезное внимание, как на одну из альтернатив подходу СОМ\ На основе технологии СОМ был создан ряд расширений, например серверы автоматизации (как в примере с автоматизацией OLE), активные серверные страницы ASP (Active Server Pages) и др. Одно из наиболее известных расширений технологии СОМ — элементы ActiveX, первоначально создававшиеся для использования в Интернете.

Основное различие технологий СОМ и OLE — возможность автоматического общения между компонентами СОМ и приложениями и наличие базового интерфейса, с помощью которого программа может выяснить, поддерживает ли конкретный объект СОМ функцию, нужную приложению (например, вычисление синуса или формирование определенного набора данных).

Составные части технологии СОМ

При создании приложения СОМ используются следующие понятия.

Таблица 8-3. Понятия технологии СОМ

Понятие Что это такое

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

Законченный модуль кода (ЕХЕ или DLL), в котором хранится программный код одного или нескольких объектов СОМ

Программный код в котором происходит обращение к интерфейсу СОМ с запросом на выполнение услуг сервера СОМ. Клиент СОМ знает, что ему надо получить от сервера СОМ, но не знает, как сервер будет это реализовывать и, вообще, где сервер физически расположен. Некоторая аналогия для клиента СОМ — рассмотренный ранее гример контейнера OLE

Интерфейс СОМ позволяет клиентам СОМ общаться с сервером СОМ на основе стандартного механизма публикации интерфейса. После того как интерфейс СОМ опубликован (стандартным способом зарегистрирован в операционной системе), изменять его нельзя, что гарантирует одинаковую работу объекта СОМ в любых условиях.

ЗАМЕЧАНИЕ Идея интерфейсов СОМ аналогично идее реализации интерфейсной части (interface) в модулях Паскаля, когда другим разработчикам доступен для использования закрытый код и открытое описание его возможностей.

Базовый интерфейс I U nknown, который имеется у любого объекта СОМ, позволяет узнать, какие еще интерфейсы СОМ доступны для клиента СОМ Все эти интерфейсы наследуют характеристики интерфейса I U nknown.

ЗАМЕЧАНИЕ Название каждого интерфейса начинается с заглавной буквы I(Interface).

Уникальность интерфейса обеспечивается его глобальным идентификатором Globally Unique Identifier (GUID) длиной 16 байтов, а каждый объект СОМ имеет идентификатор интерфейса на основе GUID. Идентификатор GUID требуется, чтобы избежать проблем при появлении интерфейсов СОМ с одинаковыми именами. Например, многие разработчики могут независимо друг от друга создать интерфейс СОМ с именем IGame, однако в каждом конкретном

объекте СОМ он будет выполнять разные функции. Для того чтобы различать интерфейсы СОМ не по именам, и были введены идентификаторы GUID.

Благодаря наличию стандартных интерфейсов объект СОМ может быть реализован на любом языке программирования (в том числе и в системе Delphi 7).

Интерфейс I U nknown содержит метод Querylnterface, возвращающий ссылку на другие доступные интерфейсы, атакже методы AddRef и Release, которые увеличивают и уменьшают счетчик ссылок на конкретный интерфейс, когда к нему происходит обращение клиента СОМ. Например, пусть сервер СОМ содержит объект СОМ, имеющий интерфейс ICos, в котором содержится метод, вычисляющий косинус. При каждом обращении из разных программ к этому интерфейсу для вычисления косинуса счетчик увеличивается, а когда интерфейс освобождается (косинус вычислен и его значение

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

Когда клиент СОМ обращается к серверу СОМ, он передает ему идентификатор класса CLSID, представляющий собой GUID, который ссылается на подходящий объект СОМ. Сервер СОМ создает специальный объект — фабрику классов (Кlass Factoгу), — который занимается непосредственно созданием и загрузкой (производством) экземпляра нужного объекта СОМ, выполняющего конкретные действия его интерфейса, указанные в запросе клиента СОМ.

Фабрика классов «выпускает» объект СОМ, реализующий один или несколько интерфейсов СОМ, а также экземпляр специал ьного класса CoClass, который обеспечивает возможность обращения к объекту СОМ на основе интерфейсов СОМ.

ЗАМЕЧАНИЕ В реальной работе этот класс называется так же, как класс создаваемого объекта (например, TTestObj), только вместо начальной буквы Т будет использована приставка Со — CoTestObj.

Серверы CO M реализуются тремя способами.

Расширения технологии СОМ

Ниже описаны некоторые расширения технологии СОМ.

Таблица 8.4. Расширения технологии СОМ

Тип расширения Что это такое

Объекты СОМ, которые могут программно управляться из Других приложений. Например, большинство офисных приложений Windows, а также браузер Microsoft Internet Explorer, валяются серверами автоматизации

Так называются клиенты СОМ, которые управляют серверами автоматизации И имеют дополнительные возможности настройки такого управления

Серверы СОМ, встраиваемые в приложения и содержащие средства для своей визуальной настройки. В некоторой степени аналогичны компонентам Delphi 5, которые можно настраивать с помощью Инспектора объектов и собственных редакторов

Библиотеки, хранящие описание объектов и их интерфейсов

Активные серверные страницы (ASP)

Компоненты ActiveX, которые предназначены для создания Web-страниц, активно взаимодействующих с пользователем

Объекты СОМ, которые поддерживают технологию OLE, методику перетаскивания и визуальное редактирование. Таковы, например,документы редактора Word

Визуальные мультипроцессные объекты

Объекты СОМ, которые могут использоваться в одновременно

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *