Delphi — чтение в большом файле с помощью IFuture из библиотеки параллельного программирования

Я читаю какой-то большой файл excel, который загружается «веками». Я могу загрузить его до того, как мне действительно понадобится к нему доступ. Поэтому я подумал, что это было бы хорошим применением для IFuture из библиотеки параллельного программирования. Но я не уверен, как это сделать, поскольку все примеры «Будущего» охватывают только простые типы, такие как строки, целые числа и т. д.

Вот непараллельный код:

xls := TsmXLSFile.Create;
xls.Open(s);

Где «xls» — объект Excel, а «s» — поток памяти.

Как бы по этому поводу поступило «Будущее»? Могу ли я объявить xls как...

xls := IFuture<TsmXLSFile>

Это верно. Если это так, то нужно ли мне освобождать его, как обычный TsmXLSFile, так как теперь это интерфейс?

Стив


person Steve Maughan    schedule 05.05.2016    source источник


Ответы (2)


Объявите поле для доступа к этому интерфейсу:

FXlsFuture: IFuture<TsmXLSFile>;

Добавьте метод для создания этого будущего и еще один для обработки загруженного файла:

function TForm90.CreateXlsFuture: IFuture<TsmXLSFile>;
begin
  { starts loading }
  Result := TTask.Future<TsmXLSFile>(
    function: TsmXLSFile
    begin
      result := TsmXLSFile.Create;
      result.Open(s);
    end);
end;

procedure TForm90.HandleXlsFuture(AFuture: IFuture<TsmXLSFile>);
var
  xsl: TsmXLSFile;
begin
  xsl := AFuture.Value; { eventually blocks until the file is loaded }
  { do something with the file }
  xsl.Free;
end;

Кроме того, вы можете запросить Status будущего, чтобы проверить, загружен ли файл, чтобы избежать блокировки.

person Uwe Raabe    schedule 05.05.2016

Нет, ты не можешь этого сделать. Вы бы сделали это примерно так:

... // this must be a persistant object
  ismXLSFile : IFuture< TsmXLSFile >;
...

// Get started

ismXLSFile := TTask.Future< TsmXLFile > (function : TsmXLFile begin Result := TsmXLFile.Create ); end; );

ismXLSFile.Start;

// Then at some later point
xls := ismXLSFile.Value;

И да, вам все еще нужно освободить его. xls не является интерфейсным объектом. (ismXLSFile есть).

person Dsm    schedule 05.05.2016
comment
Вызов Start не нужен, так как он уже сделан TTask.Future. - person Uwe Raabe; 05.05.2016