Самоучитель по Delphi 7 для профессионалов


Отложенный (асинхронный) ввод/вывод - часть 2


Листинг 9.2. Пример отложенной операции чтения 

function TMyClass.Read(var Buffer; Count: Longint): Longint;

var succ : boolean;nb : Cardinal;LastError : Longint;

Overlap: TOveriapped;

begin

FillChar(Overlap,SizeOf(Overlap),0);

Overlap.hEvent := CreateEvent(nil, True, False, nil);

Result := Maxlnt;

succ := ReadFiie(FHandle, Buffer, Count, nb, SOverlapRd);

//

// Здесь можно вставить любые операторы, которые // могут быть выполнены до окончания ввода/вывода 

//

if not succ then 

begin

LastError := GetLastError;

 if LastError = ERROR_IO_PENDING 

then 

begin

if WaitForSingleObject(OverlapRd.hEvent, INFINITE)=WAIT_OBJECT_0 then

GetOverlappedResult(FHandle, OverlapRd, nb, TRUE); 

end 

else

raise EAbort.Create(Format('Read failed, error %d',[LastError])); 

end;

Result := nb;

 CloseHandle(hEvent);

 end;

Если вы задали конечный интервал в миллисекундах, а операция еще не закончена, waitForSingieObject вернет код завершения WAIT_TIMEOUT. Функция GetOverlappedResult возвращает в параметре nb число байтов, действительно прочитанных или записанных во время отложенной операции.

 




Начало  Назад  Вперед



Книжный магазин