SITUATIONDelphi korrekte Verwendung von Aufgaben
Zum besseren Verständnis der PPL und wie ein Task
Arbeiten habe ich versucht, ein sehr einfaches Programm, in dem machen, wenn Sie auf eine Schaltfläche geklickt haben, ein ListBox
mit einer Liste gefüllt ist von Verzeichnissen auf der Festplatte.
procedure TForm3.Button1Click(Sender: TObject);
var proc: ITask;
begin
//Show that something is going to happen
Button1.Caption := 'Process...';
proc := TTask.Create(
procedure
var strPath: string;
sl: TStringDynArray;
begin
if (DirectoryExists('C:\Users\albertoWinVM\Documents\uni\maths')) then
begin
ListBox1.Items.Clear;
sl := TDirectory.GetDirectories('C:\Users\albertoWinVM\Documents\uni\maths',
TSearchOption.soAllDirectories, nil);
for strPath in sl do
begin
ListBox1.Items.Add(strPath);
end;
//At the end of the task, I restore the original caption of the button
Button1.Caption := 'Go';
Label1.Caption := 'Finished';
end;
end
);
proc.Start;
end;
Der Ordner maths
Sie oben ist nicht sehr groß sehen und die Aufgabe dauert ca. 3 Sekunden auszuführen. Die Aufgabe wird wie folgt deklariert:
type
TForm3 = class(TForm)
ListBox1: TListBox;
//... other published things var ...
private
proc: ITask;
public
//... public var ...
end;
PROBLEM
Wenn ich (zum Beispiel) arbeiten mit C:\Users\albertoWinVM\Documents
Ich habe eine sehr große Anzahl von Ordnern und das Programm dauert bis zu 3 Minuten vor Füllen der ListBox.
Wenn ich das Programm geschlossen (während der Aufgabe noch ausgeführt wird) über den Code nur mit dem, was ich online verstanden habe gelesen hat, wird nach wie vor die Aufgabe ausgeführt, bis er nicht beendet ist. Hab ich recht?
Ich dachte, dass ich diesen Code hinzufügen könnte, um die Sicherheit des Programms zu verbessern. Ist das genug?
Für große Verzeichnislisten (oder jede große Liste) kann es auf der Benutzeroberfläche zu Batch-Updates nützlich sein. Die Aufgabe kann einige Dutzend Elemente sammeln und dann mit "BeginUpdate" und "EndUpdate" in der Listbox stapelweise aktualisieren. Das Aktualisieren jedes Elements kann ein Performance-Schwein sein. Dies erzeugt natürlich auch ein schönes Intervall zum Aufrufen von 'CheckCanceled', so dass '.Cancel' es' proc.Wait() 'erlaubt, rechtzeitig zurückzukehren. –
Ich dachte, dass vor dem Posten, aber das wirft Probleme mit Speicherverwaltung und Objektbesitz. Aber ich habe meine Antwort aktualisiert. –
Ich habe nicht erwartet, dass Sie Ihre Antwort aktualisieren - wurde nur für OP als eine Idee verlassen. Ich habe es aus demselben Grund nicht in meine Antwort aufgenommen; alles wird ziemlich schnell kompliziert. +1, auf jeden Fall! –