Асинхронные операции ввода-вывода
Весьма часто, в особенности при работе с файлами, размещенными на удаленных компьютерах, при работе с поименованными каналами и сокетами программисты вынуждены осуществлять операции ввода-вывода в так называемом асинхронном режиме. Любая операция записи или чтения больших объемов данных, да еще по каналу с низкой пропускной способностью, может занимать весьма внушительный интервал времени. При проведении синхронной операции, например вывода данных, выполнение программы было бы приостановлено до тех пор, пока метод записи не завершит свою работу и не возвратит управление вызвавшей его программе. Это не очень эффективно, т. к. в это время могли бы выполняться какие-то другие действия, не связанные с вводом-выводом. Ключевая особенность асинхронной операции состоит в том, что, отправив порцию данных в файл, программа не дожидается завершения этой операции. Асинхронный метод моментально возвращает управление вызвавшей его программе и только затем приступает к выполнению поставленной задачи.
Для организации асинхронных операций ввода-вывода целесообразно использовать методы Win32 API ReadFileEx() и WriteFileEx().
Function ReadFileEx (hFile : THandle; Buf : pointer; NumberOfBytesToRead
: cardinal; const Overlapped : pOverlapped; CompletionRoutine : pointer)
: Boolean;
Function WriteFileEx (hFile : THandle; Buf : pointer; NumberOfBytesTo-
Write : cardinal; const Overlapped : pOverlapped; CompletionRoutine :
pointer) : Boolean;
Здесь hFile – дескриптор файла, полученный при помощи методов Win32 API OpenFile() и CreateFile() или соответствующих методов Object Pascal FileOpen() и CreateFile(). Buf – указатель на буфер, в который будут помещаться прочитанные данные или, наоборот, данные из которого будут записываться в файл. Третий параметр возвращает общее количество прочитанных (NumberOfBytesToRead) или записанных (NumberOfBytesToWrite) байт. Особый интерес вызывает четвертый аргумент – указатель на специальную структуру OVERLAPPED, содержащую данные, которые будут использоваться при асинхронном чтении (или записи).
Type
POverlapped = ^TOverlapped;
_OVERLAPPED = record
Internal: DWORD;
InternalHigh: DWORD;
Offset: DWORD;
OffsetHigh: DWORD;
hEvent: THandle;
end;
Поля Internal и InternalHigh зарезервированы за операционной системой. В частности, они используются ОС для определения статуса проводимой асинхронной операции. Поля Offset и OffsetHigh соответственно хранят 32 младших и 32 старших бита позиции файла, с которой должно начинаться чтение или запись. Поле hEvent содержит дескриптор специального объекта синхронизации, называемого событием. Его мы изучим в главе 20 «Процессы и потоки в среде Windows». В данном контексте объект-событие применяется для передачи информации процедуре завершения. Последний параметр методов ReadFileEx() и WriteFileEx() – указатель на функцию обратного вызова FileIOCompletionRoutine(). Эта функция вызывается при завершении или отмене операции ввода-вывода.
Дата добавления: 2016-03-15; просмотров: 1051;