Einzelnen Beitrag anzeigen

Benutzerbild von Smiley
Smiley

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

Scan for Files mit der PPL

  Alt 19. Jun 2020, 10:53
Hallo Delphi Freunde

Ich habe mich etwas mit der PPL (parallel programming library) beschäftigt und damit einige Gehversuche gestartet.
Am Besten hat mir das CodeRage 2016 Session6 Video von Olaf Monien gefallen.
Die Embarcadero Hilfe zu PPL habe ich mir auch angesehen.
Am leichtesten verstehe ich es aber durch Beispiele.
Als Beispiel zum ausprobieren habe ich mir folgendes ausgedacht:
Einlesen von Verzeichnissen (FindFirst,FindNext) und messen der Geschwindigkeit bei mehreren Tasks.
Dass hier eine Begrenzung durch das Filesystem gegeben ist ist mir klar, ich wollte herausfinden wie weit threading hier sinnvoll ist.
Es macht natürlich einen Unterschied ob ich auf eine Festplatte,SSD oder LAN zugreife. Eventuell auch auf mehrere davon gleichzeitig, was eine parallelisierung sinnvoller macht.

Beispiel Verzeichnisse einlesen:
Ich habe ein Startverzeichnis mit 10 Unterverzeichnissen, diese haben ebenfalls Unterverzeichnisse, insgesamt 100 UnterUnterverzeichnisse und einige tausend Dateien.
Mit Filesearch sollen alle Verzeichnisse mit maximal 3 Threads gelesen werden.
Wenn ein SubSub..Dir beendet wurde, soll die Trackbar erhöht werden. Trackbar.max ist schon ein Problem, da ich noch nicht weiß wieviele SubDirs ich habe.
Eventuell das mit readDirs erst mal vorab einlesen ? wenn das nicht schon zu lange dauert.
Wie könnte man das am effektivsten lösen ?

Das beigelegte BeispielProjekt ist ein Anfang dazu. Die folgenden wichtigen Punkte sind aber noch nicht drin:

1. Threadpool (TThread.Queue) benutzen um nur eine begrenzte Anzahl von Tasks gleichzeitig laufen zu lassen ohne parallel.for ( MaxThread:=3; )
2. Thread Events benutzen (OnTerminate) kann ich darin auf threadvariablen zugreifen ? (ThreadStatus,threadID)
3. Kann ich die StopWatch im Thread benutzen um die threadzeit zu messen ?
4. System.Monitor.Enter(self); try inc(Taskcounter); finally System.Monitor.Stop(self); end; Ist das wie Synchronize um Variablen im Haupthread zu verändern. Welche Vorteile bringt das ?
5. Den Status der Threads, aus dem MainThread, lesen um festzustellen welcher Thread noch läuft. Kein WaitFor.. ich will im MainThread derweil noch andere Dinge machen.
6. Trackbar.Position bewegen wenn ein Thread seine Aufgabe erfüllt hat.
7. Wie kann ich durch einen Cancel Button alle Tasks abbrechen ?

Ich benutze Delphi 10.4 Architect auf Windows 10 1909. TMS AllAccess vorhanden. (In Bereich Filesearch oder Tasks hat TMS aber glaube ich nichts spezielles enthalten)
Angehängte Dateien
Dateityp: zip ScanForFilesThread.zip (25,8 KB, 13x aufgerufen)

Geändert von Smiley (19. Jun 2020 um 11:14 Uhr)
  Mit Zitat antworten Zitat