Einzelnen Beitrag anzeigen

Benutzerbild von Smiley
Smiley

Registriert seit: 9. Dez 2004
Ort: Gedern
205 Beiträge
 
Delphi 10.4 Sydney
 
#1

DirList optimieren

  Alt 28. Aug 2019, 18:17
Nachdem mein letztes Thema "TTask.WaitForAll hängt" sich etwas vom Thema entfernt hat mache ich hier ein neues Thema auf.

Mein Ziel ist es Dateien auf meiner Festplatte oder im Netzwerk in einer Datenbak zu sammeln und dann zu sortieren, kategorisieren, packen und, mit Suchbegriffen leicht zu finden, in der DB abzulegen (Blob).

Das erste was zu tun war ist das einlesen der Dateien. Damit das effizient funktioniert, sollte das über threads abgewickelt werden.
Ein anderer Thread soll dann die Daten in eine Datenbank bringen.

Schokohase hat mir eine gute Grundlage für mein Projekt gegeben mit dem ich nun weiterarbeiten möchte.
Dafür nochmal Dank an Schokohase, der mir ein richtiges Beispiel zum ausprobieren gegeben hat.
Ich lerne mit Beispielen die funktionieren am besten.

Meine Version hat zwar auch funktioniert aber sie war schlecht programmiert und ohne eigene Klasse.

Noch habe ich aber nicht alles verstanden was er da programmiert hat und es funktioniert noch nicht ganz so wie ich es möchte.

Mir geht es nicht einfach darum ein Programm hinzubekommen, sondern darum Techniken und Teile von Delphi zu lernen die ich noch nicht kenne.

In diesem Projekt wird zum Beispiel, zur Anzeige, mit einer ListView gearbeitet, die ich bisher nie verwendet habe und nicht verstehe wie das Ereignis OnData getriggert wird und warum es dann die ganze Liste von FFiles einliest obwohl darin nur ein Datensatz zugewiesen wird.

Delphi-Quellcode:
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem);
begin
  Item.Caption := FFiles[Item.Index];
  Item.SubItems.Add(TPath.GetDirectoryName(FFiles[Item.Index]));
  Item.SubItems.Add(TPath.GetFileName(FFiles[Item.Index]));
  Item.SubItems.Add('');
end;

procedure TForm1.PresentFiles(const Files: TStringDynArray;DirIndex:Integer);
 var
 i : integer;

begin
  FFiles.AddRange(Files);
  ListView1.Items.Count := FFiles.Count;
end;
Ich kann mir nur vorstellen dass das Zuweisen von FFiles.Count hier den Trigger auslöst.
Aber das ListView1Data bekommt doch nur einen Item übergeben und trotzdem ist die ganze Liste von FFiles im TreView enthalten.

Zweitens werden die Dateien im Ersten Verzeichnis , das ich durchsuche, nicht aufgelistet, nur der Ordner wir angezeigt. Beim ersten Durchlauf sind ja auch noch gar keine Files eingelesen worden.

Drittens möchte ich noch etwas mehr in die uDirlist Unit auslagern, damit das hier besser lesbar wird und ich möchte das Synchronize etwas minimieren.
Fehler und Infos können ja wenn möglich in der Klasse gespeichert werden und werden erst im nächsten PresentFiles ausgewertet.

Viertens: kann man die FFiles Liste nicht erst mal in einer Warteschlange speichern, beim übergeben (PresentFiles), damit das Einlesen der Daten gleich weitergehen kann und nicht auf die Ablage der Daten in ListView oder DB gewartet werden muss ?
Dann kann ein anderer Thread oder der Mainthread die Warteschlange dann nebenbei abarbeiten und die Daten irgendwo ablegen.

Ich hoffe die Community beteiligt sich hier mit konstruktiven Hinweisen, Danke.

Anbei bisher vorhandene Projekt DirList2.
Angehängte Dateien
Dateityp: zip Dirlist2.zip (54,4 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat