Главная » Delphi » Выбор модели потоков

0

Поддержка потоков в Delphi  5 претерпела коренные изменения. В версии 4 выбор модели  потоков для сервера ЕХЕ не имел  особого смысла.  В системном реестре про сто устанавливался флажок, сообщающий подпрограммам СОМ, что функции данной библиотеки DLL  могут  выполняться с  использованием  указанной модели  потоков. В Delphi 5 и 6 выбор  модели  потоков применим и для серверов ЕХЕ, что  позволяет подпрограммам СОМ распределять соединения по отдельным потокам без необходи мости  применения дополнительного кода.  Для  модулей  RDM допустимы следующие модели потоков.

•  Одиночная (single). Выбор этой модели означает, что сервер одновременно может обрабатывать лишь один  запрос. При  использовании одиночной модели  нет не обходимости заботиться об  управлении потоками, поскольку  действия сервера ограничены одним  потоком, а необходимую синхронизацию сообщений осуще ствляют подпрограммы COM. Однако выбор  такой  модели  окажется неудачным, если  планируется создать  многопользовательскую систему,  поскольку  клиент В, прежде чем  начать  свою  работу,  будет вынужден  ожидать, пока  не  завершится обработка запроса клиента А. Этот подход чаще всего оказывается абсолютно не приемлемым, поскольку  нет никаких гарантий, что  клиент А не занят  в данный момент  формированием ежедневного отчета или  не выполняет какие либо  дру гие операции, требующие значительных затрат времени.

•  Раздельная (apartment). Выбор  этой модели  потоков дает самые высокие результа ты в сочетании с присвоением параметру способа  создания экземпляров значе ния  ciMultiInstance. В этом  случае,  благодаря параметру ciMultiInstance, все  клиенты будут совместно использовать один  процесс сервера, однако  при этом работа одного  клиента с сервером не будет блокировать работу другого кли ента,  поскольку  каждый  из них  будет работать с собственным потоком сервера. При выборе данной модели потоков гарантируется, что данные  экземпляра моду ля RDM будут использоваться в безопасном режиме. Однако при  этом  необходи мо защитить доступ к глобальным переменным, для чего можно  воспользоваться любым из существующих  способов синхронизации потоков — например методом PostMessage(), критическими  секциями, мьютексами, семафорами  или  клас сом оболочкой Delphi TMultiReadExclusiveWriteSynchronizer. Именно эту модель  потоков предпочтительнее использовать при  работе с наборами данных BDE. Обратите внимание, что при использовании такой модели потоков наряду с наборами данных  BDE потребуется поместить в модуль RDM компонент TSes- sion и  установить значение его  свойства AutoSessionName равным True. В этом случае BDE сможет  адаптироваться к требованиям используемой модели  по токов.•  Свободная (Free). Эта модель  обеспечивает еще большую гибкость, позволяя пе редавать серверу  несколько запросов клиентов. Но  при  использовании такой модели  необходимо обеспечить защиту  от конфликтов потоков всех данных — как данных  экземпляра, так и глобальных переменных. Эту модель  предпочти тельнее использовать вместе с объектами ADO.

•  Обе модели (Both). Эта модель так же эффективна, как и свободная модель,  но за одним  исключением: при ее использовании обратные вызовы преобразуются в последовательную форму автоматически.

Выбор способа доступа к данным

В Delphi 6 Enterprise реализовано несколько различных способов доступа к данным. В частности, по прежнему  поддерживается BDE, благодаря чему можно  использовать компоненты,  производные  от   класса   TDBDataSet,  такие   как   TTable,  TQuery и TStoredProc. Однако dbExpress обеспечивает более  гибкую архитектуру для доступа к данным.  Кроме  того,  теперь можно  воспользоваться средствами технологии ADO и на прямую связываться с сервером InterBase при помощи компонентов класса TDataSet.

Публикация служб

RDM отвечает за определение перечня служб,  доступных  клиенту.  Если  компонент TQuery модуля удаленных  данных  необходимо сделать  доступным  клиенту, то наряду  с ним  в RDM необходимо поместить и компонент TDataSetProvider. Затем  компонент TDataSetProvider связывается  с  компонентом  TQuery через  свойство TDataSet- Provider.DataSet. Позже, когда клиенту потребуется использовать данные  компонента TQuery, в этом ему поможет вновь созданный компонент TDataSetProvider. Чтобы ука зать, какие из провайдеров сервера должен видеть клиент, установите значение их свойст ва TDataSetProvider.Exported равными True или False.

В то же время, если клиенту не нужен весь набор  данных сервера, а требуется лишь осуществить вызов  метода,  то можно  обеспечить и такую возможность. Переместив фокус ввода на модуль удаленных  данных, выберите в меню Edit пункт Add to Interface и введите в раскрывшемся диалоговом окне  прототип стандартного метода.  После обновления библиотеки типов можно будет создать в коде реализацию этого метода.

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии