我正在阅读一些带有“年龄”的大型(ish)excel文件。我可以在真正需要访问它之前加载它。所以我认为这对于并行编程库中的IFuture来说是一个很好的用法。但我不知道如何去做,因为所有“未来”的例子只涵盖简单的类型,如字符串,整数等。
这是非并行代码:
xls := TsmXLSFile.Create;
xls.Open(s);
其中“xls”是Excel对象,“s”是内存流。
“未来”将如何解决这个问题?我会将xls声明为......
xls := IFuture<TsmXLSFile>
这是对的吗?如果是,那么我是否需要像普通的TsmXLSFile一样释放它,因为它现在是一个接口?
史蒂夫
答案 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是)。