Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi-使用并行编程库中的IFuture读取大文件_Delphi_Parallel Processing_Ppl - Fatal编程技术网

Delphi-使用并行编程库中的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

我正在读一些大的(ish)excel文件,它需要“时间”才能加载。我可以在真正需要访问它之前加载它。因此,我认为这将是并行编程库中IFuture的一个很好的用途。但我不知道该怎么做,因为所有的“未来”示例只涉及简单类型,如字符串、整数等

以下是非并行代码:

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
完成。