Синхронное и асинхронное выполнение запросов

В функции, допускающей асинхронную работу, присутствуют два параметра:

  • AsyncFunc – адрес функции обработки ответа;

  • UserArg – адрес единственного пользовательского аргумента этой функции.

Функция AsyncFunc должна иметь три аргумента:

void UserAsyncFunc(
   L_WORD CursorID,    /* идентификатор курсора */
   L_LONG LastError,   /* последняя LinAPI-ошибка */
   void *UserArg)      /* пользовательский аргумент */

Именно таким образом вызывается пользовательская функция в LinAPI.

Если оба адреса (AsyncFunc и UserArg) равны NULL, то запрос выполняется синхронно, т.е. выполнение следующего фрагмента программы не начнется раньше, чем выполнится запрос.

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

В аргументе LastError возвращается последний код завершения LinAPI-интерфейса (коды завершения LinAPI приведены в приложении 1).

Примечания

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

  2. С помощью функций LINTER_ConnectComplete или LINTER_CursorComplete приложение может проверить завершение обработки запроса и, если запрос не обработан, перейти в режим ожидания завершения его обработки. Если адрес AsyncFunc (при не нулевом UserArg) равен NULL, то запрос все равно будет выполняться асинхронно, единственным способом определения прихода ответа является использование функции LINTER_ConnectComplete/LINTER_CursorComplete.

  3. Асинхронность доступна в операционных системах: Linux, ЗОСРВ Нейтрино, Windows, VMS, OS-9, OS-9000.