Delphi - 使用并行编程库中的IFuture读取大文件

时间:2016-05-05 14:55:41

标签: delphi parallel-processing ppl

我正在阅读一些带有“年龄”的大型(ish)excel文件。我可以在真正需要访问它之前加载它。所以我认为这对于并行编程库中的IFuture来说是一个很好的用法。但我不知道如何去做,因为所有“未来”的例子只涵盖简单的类型,如字符串,整数等。

这是非并行代码:

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

其中“xls”是Excel对象,“s”是内存流。

“未来”将如何解决这个问题?我会将xls声明为......

xls := IFuture<TsmXLSFile>

这是对的吗?如果是,那么我是否需要像普通的TsmXLSFile一样释放它,因为它现在是一个接口?

史蒂夫

2 个答案:

答案 0 :(得分:4)

声明一个字段以获取该接口:

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以检查文件是否已加载以避免阻止。

答案 1 :(得分:1)

不,你不能这样做。你会更喜欢这样做:

... // 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是)。