Синхронное и асинхронное выполнение запросов
В функции, допускающей асинхронную работу, присутствуют два параметра:
-
AsyncFunc
– адрес функции обработки ответа; -
UserArg
– адрес единственного пользовательского аргумента этой функции.
Функция AsyncFunc
должна иметь три аргумента:
void UserAsyncFunc( L_WORD CursorID, /* идентификатор курсора */ L_LONG LastError, /* последняя LinAPI-ошибка */ void *UserArg) /* пользовательский аргумент */
Именно таким образом вызывается пользовательская функция в LinAPI.
Если оба адреса (AsyncFunc
и UserArg
) равны NULL, то запрос выполняется синхронно, т.е. выполнение
следующего фрагмента программы не начнется раньше, чем выполнится запрос.
В противном случае программа выполняется далее, не ожидая конца обработки запроса (асинхронно). Как только запрос будет выполнен (с ошибкой или без нее),
и приложение узнает об этом, то естественное выполнение программы прерывается, и вызывается указанная функция обработки ответа (с передачей ей UserArg
).
Выполнив функцию AsyncFunc, исполняющая система продолжит работу программы с той точки, где она была прервана.
В аргументе LastError
возвращается последний код завершения LinAPI-интерфейса (коды завершения LinAPI приведены в приложении 1).
Примечания
-
О реентерабельности функций обработки ответа пользователь должен заботиться сам, т.к. нет гарантий, что при выполнении такой функции (асинхронный случай) не может быть вызвана другая (или та же) функция обработки ответа.
-
С помощью функций
LINTER_ConnectComplete
илиLINTER_CursorComplete
приложение может проверить завершение обработки запроса и, если запрос не обработан, перейти в режим ожидания завершения его обработки. Если адресAsyncFunc
(при не нулевом UserArg) равен NULL, то запрос все равно будет выполняться асинхронно, единственным способом определения прихода ответа является использование функцииLINTER_ConnectComplete
/LINTER_CursorComplete
. -
Асинхронность доступна в нескольких операционных системах: UNIX, Windows NT, VMS, OS-9, OS-9000.