Глубины Indy

       

Неблокирующий режим записи файла


Не существует такой вещи как неблокирующий режим записи файла (может быть исключая overlapped I/O, но это за пределами данной книги), но здесь мы можем просто эмулировать механизм это. File1 это условный неблокирующий компонент, размещенной на форме.

procedure TForm1.Button1Click(Sender: TObject);

begin

  File1.Filename := 'd:\temp\test.dat';

  File1.Open;

end;

procedure TForm1.File1OnOpen(Sender: TObject);

var

  i: integer;

begin

  FWriteData := 'Hello World!' + #13#10;

  i := File1.Write(FWriteData);

  Delete(FWriteData, 1, i);



end;

procedure TForm1.File1OnWrite(Sender: TObject);

var

  i: integer;

begin

  i := File1.Write(FWriteData);

  Delete(FWriteData, 1, i);

  if Length(FWriteData) = 0 then

  begin

    File1.Close;

  end;

end;

procedure TForm1.File1OnClose(Sender: TObject);

begin

  Button1.Enabled := True;

end;

Потратим немного времени, что бы попытаться понять, что здесь делается. Если вы используете неблокирующие сокеты, то вы должны легко понимать данный код. Это примерно следующее:

1. При вызове Button1Click открывается файл. Метод Open немедленно вернет управление в программу, но файл еще не открыт и нельзя с ним еще нельзя работать.

2.      Обработчик события OnOpen будет возбужден, когда файл будет открыть и готов к работе. Делается попытка записать данные в файл, но все данные еще не акцептированы. Метод Write вернет количество записанных байт. Оставшиеся данные будут сохранены позже.

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

4.      Шаг 3 повторяется до тех пор, пока все данные не будут записаны методом Write. По окончанию записи всех данных вызывается метод Close. Но файл пока еще не закрыт.

5.      The OnClose event is fired. The file is now closed.



Содержание раздела