Составители:
Рубрика:
DMLERR_SYS_ERROR – произошла внутренняя ошибка DDEML.
9.5. Синхронные и асинхронные транзакции
DDEML-клиенты могут выбирать между выполнением синхронных
и асинхронных транзакций [2]. Отличие между синхронными и асинхронными
операциями проявляется только на уровне программы-клиента. С точки зрения
программы-сервера транзакции обоих типов выглядят одинаково.
Преимущество асинхронных транзакций заключается в том, что они вы-
полняются быстрее и проще программируются. Асинхронные транзакции
применяются сильно загруженными программами, которые должны обрабаты-
вать значительный объем данных при взаимодействии с DDEML-сервером,
или программами, которые вынуждены регулярно взаимодействовать с мед-
ленным сервером и хотят избежать нежелательных периодов ожидания ответа.
В случае синхронных операций приложение-клиент ожидает ответа от сер-
вера, инициализировав транзакцию либо путем запроса информации, либо пу-
тем передачи команды для выполнения определенных операций. Если сервер
заставляет клиента ожидать дольше установленного времени, функция
DdeClientTransaction() отменяет транзакцию и завершает свою работу.
При синхронных транзакциях необходимо принимать меры для освобожде-
ния объектов данных. DDEML передает дескриптор данных в виде результирую-
щего значения функции DdeClientTransaction() и не имеет возможности узнать о
том, когда данные будут освобождены. Клиент становится владельцем объектов
данных, полученных при синхронной транзакции от функции
DdeClientTransaction(), и в конце концов должен вызвать функцию DdeFreeData-
Handle, чтобы освободить их.
В случае асинхронных операций при вызове функции DdeClientTransaction()
вместо длительности паузы следует задать значение TIMEOUT_ASYNC.
В ре-
зультате функция DdeClientTransaction() немедленно возвратит значение TRUE, а
также идентификатор транзакции в поле dwResult.
Пока приложение-клиент продолжает выполнять другие операции,
DDEML осуществляет транзакцию в фоновом режиме. Затем, по завершении
транзакции, DDEML посылает сообщение XTYP_XACT_COMPLETE
функции
обратного вызова приложения-клиента. В этом сообщении в параметре
dwData1 содержится идентификатор транзакции, что позволяет клиенту опре-
делить, какой из запросов выполнен.
DDEML обеспечивает также альтернативный механизм идентификации
транзакций по их сообщениям о завершении. Клиент может зарегистрировать
свое значение типа DWORD,
связанное с каждой асинхронной транзакцией.
Функция DdeSetUserHandle() принимает дескриптор диалога, идентификатор
асинхронной транзакции и пользовательское значение типа DWORD,
сохраняя
эти параметры внутри собственной структуры данных. При получении сообще-
ния XTYP_XACT_COMPLETE
клиент читает локальный идентификатор с по-
мощью функции DdeQueryConvInfo().
127
DMLERR_SYS_ERROR – произошла внутренняя ошибка DDEML.
9.5. Синхронные и асинхронные транзакции
DDEML-клиенты могут выбирать между выполнением синхронных
и асинхронных транзакций [2]. Отличие между синхронными и асинхронными
операциями проявляется только на уровне программы-клиента. С точки зрения
программы-сервера транзакции обоих типов выглядят одинаково.
Преимущество асинхронных транзакций заключается в том, что они вы-
полняются быстрее и проще программируются. Асинхронные транзакции
применяются сильно загруженными программами, которые должны обрабаты-
вать значительный объем данных при взаимодействии с DDEML-сервером,
или программами, которые вынуждены регулярно взаимодействовать с мед-
ленным сервером и хотят избежать нежелательных периодов ожидания ответа.
В случае синхронных операций приложение-клиент ожидает ответа от сер-
вера, инициализировав транзакцию либо путем запроса информации, либо пу-
тем передачи команды для выполнения определенных операций. Если сервер
заставляет клиента ожидать дольше установленного времени, функция
DdeClientTransaction() отменяет транзакцию и завершает свою работу.
При синхронных транзакциях необходимо принимать меры для освобожде-
ния объектов данных. DDEML передает дескриптор данных в виде результирую-
щего значения функции DdeClientTransaction() и не имеет возможности узнать о
том, когда данные будут освобождены. Клиент становится владельцем объектов
данных, полученных при синхронной транзакции от функции
DdeClientTransaction(), и в конце концов должен вызвать функцию DdeFreeData-
Handle, чтобы освободить их.
В случае асинхронных операций при вызове функции DdeClientTransaction()
вместо длительности паузы следует задать значение TIMEOUT_ASYNC. В ре-
зультате функция DdeClientTransaction() немедленно возвратит значение TRUE, а
также идентификатор транзакции в поле dwResult.
Пока приложение-клиент продолжает выполнять другие операции,
DDEML осуществляет транзакцию в фоновом режиме. Затем, по завершении
транзакции, DDEML посылает сообщение XTYP_XACT_COMPLETE функции
обратного вызова приложения-клиента. В этом сообщении в параметре
dwData1 содержится идентификатор транзакции, что позволяет клиенту опре-
делить, какой из запросов выполнен.
DDEML обеспечивает также альтернативный механизм идентификации
транзакций по их сообщениям о завершении. Клиент может зарегистрировать
свое значение типа DWORD, связанное с каждой асинхронной транзакцией.
Функция DdeSetUserHandle() принимает дескриптор диалога, идентификатор
асинхронной транзакции и пользовательское значение типа DWORD, сохраняя
эти параметры внутри собственной структуры данных. При получении сообще-
ния XTYP_XACT_COMPLETE клиент читает локальный идентификатор с по-
мощью функции DdeQueryConvInfo().
127
Страницы
- « первая
- ‹ предыдущая
- …
- 125
- 126
- 127
- 128
- 129
- …
- следующая ›
- последняя »
