Delphi-使用并行编程库中的IFuture读取大文件
我正在读一些大的(ish)excel文件,它需要“时间”才能加载。我可以在真正需要访问它之前加载它。因此,我认为这将是并行编程库中IFuture的一个很好的用途。但我不知道该怎么做,因为所有的“未来”示例只涉及简单类型,如字符串、整数等 以下是非并行代码:Delphi-使用并行编程库中的IFuture读取大文件,delphi,parallel-processing,ppl,Delphi,Parallel Processing,Ppl,我正在读一些大的(ish)excel文件,它需要“时间”才能加载。我可以在真正需要访问它之前加载它。因此,我认为这将是并行编程库中IFuture的一个很好的用途。但我不知道该怎么做,因为所有的“未来”示例只涉及简单类型,如字符串、整数等 以下是非并行代码: xls := TsmXLSFile.Create; xls.Open(s); 其中“xls”是Excel对象,“s”是内存流 一个“未来”会怎么做?我会宣布xls为 xls := IFuture<TsmXLSFile> xls
xls := TsmXLSFile.Create;
xls.Open(s);
其中“xls”是Excel对象,“s”是内存流
一个“未来”会怎么做?我会宣布xls为
xls := IFuture<TsmXLSFile>
xls:=IFuture
这是正确的吗。如果是,那么我是否需要像正常的TsmXLSFile一样释放它,因为它现在是一个接口
史蒂夫:不,你不能那样做。你可以这样做:
... // 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;
..//这必须是持久对象
ismXLSFile:IFuture;
...
//开始
ismXLSFile:=TTask.Future(函数:TsmXLFile开始结果:=TsmXLFile.Create);完);;
ismXLSFile.Start;
//然后在以后的某个时候
xls:=ismXLSFile.Value;
是的,你仍然需要释放它。xls不是接口对象。(ismXLSFile是)。不,你不能那样做。你可以这样做:
... // 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;
..//这必须是持久对象
ismXLSFile:IFuture;
...
//开始
ismXLSFile:=TTask.Future(函数:TsmXLFile开始结果:=TsmXLFile.Create);完);;
ismXLSFile.Start;
//然后在以后的某个时候
xls:=ismXLSFile.Value;
是的,你仍然需要释放它。xls不是接口对象。(ismXLSFile是)。声明一个字段以获取该接口:
FXlsFuture: IFuture<TsmXLSFile>;
fxlsfourture:IFuture;
添加一个方法来创建该未来,并添加另一个方法来处理加载的文件:
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;
函数TForm90.CreateXlsFuture:IFuture;
开始
{开始加载}
结果:=TTask.Future(
功能:TsmXLSFile
开始
结果:=TsmXLSFile.Create;
结果:开放(s);
(完),;
终止
程序TForm90.HandleXlsFuture(未来:IFuture);
变量
xsl:tsmxls文件;
开始
xsl:=AFuture.Value;{最终阻塞,直到加载文件}
{对文件执行某些操作}
xsl.Free;
终止
此外,您还可以查询未来的
状态
,检查文件是否已加载以避免阻塞。声明一个字段以获取该接口:
FXlsFuture: IFuture<TsmXLSFile>;
fxlsfourture:IFuture;
添加一个方法来创建该未来,并添加另一个方法来处理加载的文件:
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;
函数TForm90.CreateXlsFuture:IFuture;
开始
{开始加载}
结果:=TTask.Future(
功能:TsmXLSFile
开始
结果:=TsmXLSFile.Create;
结果:开放(s);
(完),;
终止
程序TForm90.HandleXlsFuture(未来:IFuture);
变量
xsl:tsmxls文件;
开始
xsl:=AFuture.Value;{最终阻塞,直到加载文件}
{对文件执行某些操作}
xsl.Free;
终止
此外,您还可以查询未来的
状态
,以检查文件是否已加载以避免阻塞。对开始
的调用是不必要的,因为它已经由TTask.future
完成。开始
的调用是不必要的,因为它已经由TTask.future
完成。