2016-05-05 10 views
1

Ich lese in einigen großen (ish) Excel-Datei, die "Alter" zu laden. Ich kann es laden, bevor ich wirklich darauf zugreifen muss. Also dachte ich, das wäre ein guter Zweck für ein IFuture aus der Parallel Programming Library. Aber ich bin nicht sicher, wie man als all die „Future“ Beispiele gehen nur einfache Typen abdecken wie Strings, Integer usw.Delphi - Lesen in einer großen Datei mit IFuther aus der Parallel Programming Library

Hier ist der nicht-parallel Code:

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

Wo? " xls "ist das Excel-Objekt und" s "ist ein Speicherstream.

Wie würde eine "Zukunft" darüber gehen? Würde ich xls als ... deklarieren

xls := IFuture<TsmXLSFile> 

Ist das korrekt? Wenn es dann ist, muss ich es wie eine normale TsmXLSFile freigeben, da es jetzt eine Schnittstelle ist?

Steve

Antwort

4

ein Feld deklariert halten, diese Schnittstelle zu erhalten:

FXlsFuture: IFuture<TsmXLSFile>; 

eine Methode hinzufügen, dass die Zukunft und ein anderes zu schaffen, die geladene Datei zu handhaben:

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; 

Zusätzlich können Sie die Abfrage Status der Zukunft zu überprüfen, ob die Datei bereits geladen ist, um Blockierungen zu vermeiden.

+0

hat es funktioniert. Danke vielmals! –

1

Nein, das geht nicht. Sie würden es eher so tun:

... // 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; 

Und ja, Sie müssen immer noch es zu befreien. xls ist kein Interface-Objekt. (ismXLSFile ist).

+2

Der Aufruf von 'Start' ist unnötig, da es bereits von' TTask.Future' erfolgt. –