Операционные системы. Учебное пособие. Марапулец Ю.В. - 208 стр.

UptoLike

Составители: 

В случае синхронных операций приложение-клиент ожидает ответа от сервера,
инициализировав транзакцию - либо путем запроса информации, либо путем передачи
команды для выполнения определенных операций. Если сервер заставляет клиента ожи-
дать дольше установленного времени, функция DdeClientTransaction отменяет транзак-
цию и завершает свою работу.
При синхронных транзакциях необходимо принимать меры для освобождения объ-
ектов данных. DDEML передает дескриптор данных в виде результирующего значения
функции DdeClientTransaction и не имеет возможности узнать о том, когда данные будут
освобождены. Клиент становится владельцем объектов данных, полученных при син-
хронной транзакции от функции DdeClientTransaction, и, в конце концов, должен вы-
звать функцию DdeFreeDataHandle, чтобы освободить их.
В случае асинхронных операций при вызове функции DdeClientTransaction вместо
длительности паузы следует задать значение TIMEOUT_ASYNC. В результате функция
DdeClientTransaction немедленно возвратит значение TRUE, а также идентификатор
транзакции в поле dwResult.
Пока приложение-клиент продолжает выполнять другие операции, DDEML осуще-
ствляет транзакцию в фоновом режиме. Затем, по завершении транзакции, DDEML по-
сылает сообщение XTYP_XACT_COMPLETE
функции обратного вызова приложения-
клиента. В этом сообщении в параметре dwData1 содержится идентификатор транзак-
ции, что позволяет клиенту определить, какой из запросов выполнен.
DDEML обеспечивает также альтернативный механизм идентификации транзакций
по их сообщениям о завершении. Клиент может зарегистрировать свое значение типа
DWORD,
связанное с каждой асинхронной транзакцией. Функция DdeSetUserHandle
принимает дескриптор диалога, идентификатор асинхронной транзакции и пользова-
тельское значение типа DWORD, сохраняя эти параметры внутри собственной структу-
ры данных. При получении сообщения XTYP_XACT_COMPLETE клиент читает ло-
кальный идентификатор с помощью функции DdeQueryConvInfo.
Ожидая завершения асинхронной транзакции, функция DdeClientTransaction вхо-
дит в цикл и производит опрос сообщений каждого из окон, что позволяет клиенту про-
должать реагировать на команды пользователя, ожидая ответа на транзакцию. Однако в
течение этого периода клиент не может выполнить другую DDEML-функцию.
Кроме того, попытка вызвать функцию DdeClientTransaction завершается неудачно,
если у того же самого клиента в данный момент выполняется другая, синхронная тран-
закция.
Чтобы отменить асинхронную операцию, не дожидаясь ее завершения, следует вы-
звать функцию DdeAbandonTransaction. При этом DDEML освобождает все ресурсы,
связанные с транзакцией, и отменяет результаты, возвращенные сервером. (Аналогич-
ный процесс происходит по истечении времени, отведенного на выполнение синхронной
транзакции.)
При асинхронной транзакции DDEML предоставляет клиентской функции обрат-
ного вызова дескриптор объекта данных. Когда функция обратного вызова возвращает
результат, DDEML резонно предполагает, что данные больше не нужны, и автоматиче-
ски освобождает объект данных. Если клиент хочет сохранить данные, он должен их
скопировать с помощью функции DdeGetData.
Как объяснялось ранее, обычная последовательность инициации диалога предпола-
гает, что клиент знает заранее, какие ему нужны cервисы и/или темы, Чтобы предоста-
вить возможность клиентам просмотреть все доступные темы, DDE-серверы иногда со-
держат для каждого сервиса тему, которая называется system.
С помощью этой темы обеспечивается поддержка набора стандартных элементов,
Кроме того, тема system позволяет клиенту получить информацию о конкретном сервисе
[12].
210
      В случае синхронных операций приложение-клиент ожидает ответа от сервера,
инициализировав транзакцию - либо путем запроса информации, либо путем передачи
команды для выполнения определенных операций. Если сервер заставляет клиента ожи-
дать дольше установленного времени, функция DdeClientTransaction отменяет транзак-
цию и завершает свою работу.
      При синхронных транзакциях необходимо принимать меры для освобождения объ-
ектов данных. DDEML передает дескриптор данных в виде результирующего значения
функции DdeClientTransaction и не имеет возможности узнать о том, когда данные будут
освобождены. Клиент становится владельцем объектов данных, полученных при син-
хронной транзакции от функции DdeClientTransaction, и, в конце концов, должен вы-
звать функцию DdeFreeDataHandle, чтобы освободить их.
      В случае асинхронных операций при вызове функции DdeClientTransaction вместо
длительности паузы следует задать значение TIMEOUT_ASYNC. В результате функция
DdeClientTransaction немедленно возвратит значение TRUE, а также идентификатор
транзакции в поле dwResult.
      Пока приложение-клиент продолжает выполнять другие операции, DDEML осуще-
ствляет транзакцию в фоновом режиме. Затем, по завершении транзакции, DDEML по-
сылает сообщение XTYP_XACT_COMPLETE функции обратного вызова приложения-
клиента. В этом сообщении в параметре dwData1 содержится идентификатор транзак-
ции, что позволяет клиенту определить, какой из запросов выполнен.
      DDEML обеспечивает также альтернативный механизм идентификации транзакций
по их сообщениям о завершении. Клиент может зарегистрировать свое значение типа
DWORD, связанное с каждой асинхронной транзакцией. Функция DdeSetUserHandle
принимает дескриптор диалога, идентификатор асинхронной транзакции и пользова-
тельское значение типа DWORD, сохраняя эти параметры внутри собственной структу-
ры данных. При получении сообщения XTYP_XACT_COMPLETE клиент читает ло-
кальный идентификатор с помощью функции DdeQueryConvInfo.
      Ожидая завершения асинхронной транзакции, функция DdeClientTransaction вхо-
дит в цикл и производит опрос сообщений каждого из окон, что позволяет клиенту про-
должать реагировать на команды пользователя, ожидая ответа на транзакцию. Однако в
течение этого периода клиент не может выполнить другую DDEML-функцию.
      Кроме того, попытка вызвать функцию DdeClientTransaction завершается неудачно,
если у того же самого клиента в данный момент выполняется другая, синхронная тран-
закция.
      Чтобы отменить асинхронную операцию, не дожидаясь ее завершения, следует вы-
звать функцию DdeAbandonTransaction. При этом DDEML освобождает все ресурсы,
связанные с транзакцией, и отменяет результаты, возвращенные сервером. (Аналогич-
ный процесс происходит по истечении времени, отведенного на выполнение синхронной
транзакции.)
      При асинхронной транзакции DDEML предоставляет клиентской функции обрат-
ного вызова дескриптор объекта данных. Когда функция обратного вызова возвращает
результат, DDEML резонно предполагает, что данные больше не нужны, и автоматиче-
ски освобождает объект данных. Если клиент хочет сохранить данные, он должен их
скопировать с помощью функции DdeGetData.
      Как объяснялось ранее, обычная последовательность инициации диалога предпола-
гает, что клиент знает заранее, какие ему нужны cервисы и/или темы, Чтобы предоста-
вить возможность клиентам просмотреть все доступные темы, DDE-серверы иногда со-
держат для каждого сервиса тему, которая называется system.
      С помощью этой темы обеспечивается поддержка набора стандартных элементов,
Кроме того, тема system позволяет клиенту получить информацию о конкретном сервисе
[12].


                                        210