Выполнение процедуры завершения и возврат из функции дежурного ожидания

Выполнение процедуры завершения и возврат из функции дежурного ожидания

По окончании выполнения операции расширенного ввода/вывода связанная с ней процедура завершения со своими аргументами, определяющими структуру OVERLAPPED, счетчик байтов и код ошибки, помещается в очередь для выполнения.

Все процедуры завершения, находящиеся в очереди потока, начинают выполняться тогда, когда поток переходит в состояние дежурного ожидания. Они выполняются поочередно, но не обязательно в той же последовательности, в которой завершились операции ввода/вывода. Возврат из функции дежурного ожидания происходит только после того, как осуществят возврат процедуры завершения. Эту особенность важно учитывать для обеспечения правильного функционирования большинства программ, поскольку при этом предполагается, что процедуры завершения получают возможность подготовиться к очередному использованию структуры OVERLAPPED и выполнить другие необходимые действия для перевода программы в известное состояние, прежде чем будет осуществлен возврат из состояния дежурного ожидания.

Если возврат из функции SleepEx обусловлен выполнением одной или нескольких процедур завершения, находящихся в очереди, то возвращаемым значением функции будет WAIT_TO_COMPLETION, и это же значение будет возвращено функцией GetLastError, вызванной после выполнения возврата одной из функций ожидания.

В заключение отметим два момента:

1. При вызове любой из функций дежурного ожидания в качестве значения параметра интервала ожидания используйте INFINITE. В отсутствие возможности истечения интервала ожидания возврат из функций будет осуществляться лишь после того, как закончится выполнение всех процедур завершения или дескрипторы перейдут в сигнальное состояние.

2. Для передачи информации процедуре завершения общепринято использовать элемент данных hEvent структуры OVERLAPPED, поскольку это поле игнорируется ОС. 

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

Рис. 14.2. Асинхронный ввод/вывод с использованием процедур завершения

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

ЛЕКЦИЯ № 3. Процедуры и функции

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

ЛЕКЦИЯ № 3. Процедуры и функции 1. Понятие вспомогательного алгоритма Алгоритм решения задачи проектируется путем декомпозиции всей задачи в отдельные подзадачи. Обычно подзадачи реализуются в виде подпрограмм.Подпрограмма – это некоторый вспомогательный алгоритм,


4. Стандартные процедуры и функции

Из книги Информатика и информационные технологии автора Цветкова А В

4. Стандартные процедуры и функции Арифметические функции1. Function Abs(X); возвращает абсолютное значение параметра.2. Function ArcTan(X: Extended): Extended; возвращает арктангенс аргумента.3. Function Exp(X: Real): Real; возвращает экспоненту.4. Function Frac(X: Real): Real; возвращает дробную часть аргумента.5. Function


Процедуры и функции

Из книги Delphi. Учимся на примерах автора Парижский Сергей Михайлович

Процедуры и функции Процедура – это именованный программный блок, который не возвращает никакого значения. В отличие от нее, функция — это именованный программный блок, возвращающий некоторое значение в точку вызова. Обычно в виде функций или процедур выделяют часто


Процедуры и функции 

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Процедуры и функции  VBScript поддерживаются два вида подпрограмм: встроенные функции и функции или процедуры


Функции и процедуры пользователя

Из книги Системное программирование в среде Windows автора Харт Джонсон М

Функции и процедуры пользователя Для определения процедуры, т.е. подпрограммы, которая не возвращает никакого значения, в VBScript используется конструкция Sub…End Sub. После названия процедуры в круглых скобках указывается список ее параметров, например:Sub MyProcedure(Param1, Param2) Dim


Выполнение обработчика завершения и выход из него

Из книги QNX/UNIX [Анатомия параллелизма] автора Цилюрик Олег Иванович

Выполнение обработчика завершения и выход из него Обработчик завершения, или блок __finally, выполняется в контексте блока или функции, работу которых он отслеживает. Управление может переходить от оператора завершения к следующему оператору. Существует и другая


Состояния дежурного ожидания

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

Состояния дежурного ожидания Во всех предыдущих примерах значение параметра bAlertable, являющегося последним параметром функции SignalObjectAndWait, полагалось равным FALSE. Используя вместо него значение TRUE, мы указываем, что ожидание должно быть, как говорят, дежурным (alertable), и тогда


Расширенный ввод/вывод с использованием процедуры завершения

Из книги Linux программирование в примерах автора Роббинс Арнольд

Расширенный ввод/вывод с использованием процедуры завершения Существует также другой возможный подход к использованию объектов синхронизации. Вместо того чтобы заставлять поток ожидать поступления сигнала завершения от события или дескриптора, система может


Функции дежурного ожидания

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Функции дежурного ожидания Всего предусмотрено пять функций дежурного ожидания, но ниже приводятся прототипы только трех из них, которые представляют для нас непосредственный интерес:  DWORD WaitForSingleObjectEx(HANDLE hObject, DWORD dwMilliseconds, BOOL bAlertable) DWORD WaitForMultipleObjectsEx(DWORD cObjects, LPHANDLE lphObjects,


Функции ожидания

Из книги Конец холивара. Pascal vs C автора Кривцов М. А.

Функции ожидания Ожидание выполнения условия для ждущей блокировки может выполняться в двух вариантах: простое ожидание и ожидание с установкой тайм-аута.int pthread_sleepon_wait(const volatile void* addr);int pthread_sleepon_timedwait(const volatile void* addr, uint64_t nsec);При вызове функций ожидания необходимо указать


19.4. Возврат значения функции

Из книги автора

19.4. Возврат значения функции После естественного завершения выполнения функции либо в том случае, когда она завершается в результате выполнения какого?либо условия, можно выбрать один из двух возможных вариантов:   1. Дождаться, пока функция естественным образом не


3. Процедуры и функции (подпрограммы)

Из книги автора

3. Процедуры и функции (подпрограммы) Подпрограммы позволяют разбить одну сложную программу на несколько более простых и решать эти отдельные задачи самостоятельно, возможно даже, что делать это будут разные программисты и в разное время. Готовую подпрограмму,