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

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

  • 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. Асинхронность доступна в нескольких операционных системах: UNIX, Windows NT, VMS, OS-9, OS-9000.