1

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

这是非并行代码:

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

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

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

xls := IFuture<TsmXLSFile>

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

史蒂夫

4

2 回答 2

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

于 2016-05-05T15:31:03.380 回答
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 是)。

于 2016-05-05T15:29:50.550 回答