Содержание материала

 

Прерывание ожидания по запросу на завершение операции ввода-вывода или APC

Windows поддерживает асинхронные вызовы процедур. При создании каждого потока (thread) с ним ассоциируется очередь асинхронных вызовов процедур (APC queue). Операционная система (или приложение пользователя, при помощи функции QueueUserAPC) может помещать в неё запросы на выполнение функций в контексте этого потока. Эти функции не могут быть выполнены немедленно, поскольку поток может быть занят. Поэтому, операционная система вызывает их, когда поток вызывает одну из следующих функций ожидания:

 

function SleepEx(

dwMilliseconds: DWORD;   // Период ожидания

bAlertable: BOOL         // задает, длжна ли функция возвращать

                          // управление в случае запроса на

                          // асинхронный вызов процедуры

): DWORD; stdcall;

 

function WaitForSingleObjectEx(

hHandle: THandle;      // Идентификатор объекта

dwMilliseconds: DWORD; // Период ожидания

bAlertable: BOOL       // задает, длжна ли функция возвращать

                        // управление в случае запроса на

                        // асинхронный вызов процедуры

): DWORD; stdcall;

 

function WaitForMultipleObjectsEx(

nCount: DWORD;            // количество объектов

lpHandles: PWOHandleArray;// адрес массива идентификаторов объектов

bWaitAll: BOOL;           // Задает, требуется ожидание всех

                           // объектов или любого

dwMilliseconds: DWORD;    // Период ожидания

bAlertable: BOOL          // задает, должна ли функция возвращать

                           // управление в случае запроса на

                           // асинхронный вызов процедуры

): DWORD; stdcall;

 

function SignalObjectAndWait(

hObjectToSignal: THandle;  // объект, который будет переведен в

                            // сигнальное состояние

hObjectToWaitOn: THandle;  // объект, которого ожидает функция

dwMilliseconds: DWORD;     // период ожидания

bAlertable: BOOL           // задает, должна ли функция возвращать

                            // управление в случае запроса на

                            // асинхронный вызов процедуры

): DWORD; stdcall;

 

function MsgWaitForMultipleObjectsEx(

nCount: DWORD;     // количество объектов синхронизации

var pHandles;      // адрес массива объектов

fWaitAll: BOOL;    // Задает, требуется ожидание всех

                    // объектов или любого

dwMilliseconds,    // Период ожидания

dwWakeMask: DWORD  // Тип события, прерывающего ожидание

dwFlags: DWORD     // Дополнительные флаги

): DWORD; stdcall;

 

Если параметр bAlertable равен TRUE (либо dwFlags в функции MsgWaitForMultipleObjectsEx содержит MWMO_ALERTABLE) , то при появлении в очереди APC запроса на асинхронный вызов процедуры операционная система выполняет вызовы всех имеющихся в очереди процедур, после чего функция возвращает значение WAIT_IO_COMPLETION.

Такой механизм позволяет реализовать, например, асинхронный ввод-вывод. Поток может инициировать фоновое выполнение одной или нескольких операций ввода-вывода функциями ReadFileEx или WriteFileEx, передав им адреса функций-обработчиков завершения операции. По завершении вызовы этих функций будут поставлены в очередь асинхронного вызова процедур. В свою очередь, инициировавший операции поток, когда он будет готов обработать результаты, может, используя одну из вышеприведенных функций ожидания, позволить операционной системе вызвать функции-обработчики. Поскольку очередь APC реализована на уровне ядра ОС, она более эффективна, чем очередь сообщений и позволяет реализовать гораздо более эффективный ввод-вывод.

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить