Прерывание ожидания по запросу на завершение операции ввода-вывода или 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 реализована на уровне ядра ОС, она более эффективна, чем очередь сообщений и позволяет реализовать гораздо более эффективный ввод-вывод.
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!