![]() |
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
Zitat:
|
AW: TObjectList-Einträge auf meherere Threads aufteilen
Ich habe das TFor.Parallel noch immer nicht richtig verstanden.
Wenn ich 20 Dateien habe und 2 Threads daraus machen möchte, wie genau zählt Schleife 1 und wie Schleife 2? Fängt Schleife 1 an zu zählen bei Index 0 an bis 9 und Schleife bei 10 von 19 ? Weil ich brauche in irgendeiner Art und Weise eine Schleifenvariable die ich in jeder dieser For-Dinger nutzen kann. Ich muss wissen wann "0" ist. Bei 0 erstelle ich eine temporäre ObjectList. Bei Index = MaxForFürDiesenDurchgang erzeuge ich den Thread. Eine andere Idee. Jetzt gerade ist es so, dass Unit A die ObjectList in mehrere aufteilt und daraus Daten für Unit B (ein Thread) baut. 1000 Dateien, 8 Threads sollen gebaut werden, jeder Thread 125 Dateien. Wenn ich das mit der neuen Herangehensweise mache, gäbe es nur noch EINEN Thread, der intern TParallel.For nutzt. Die Aufteilung und Verwaltung macht dann also TParallel.For. Hat das irgendwelche Vorteile? |
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
Das TParallel.For behandelt alle Listeneinträge von 0 bis Count - 1 (Danke Sebastian), wobei die Arbeit an einem Eintrag innerhalb der anonymen Methode erfolgt. Stell dir das erstmal wie bei einer ganz normalen Schleife vor:
Delphi-Quellcode:
Willst du das parallel mit 8 Threads erledigen, schreibst du das so:
for I := 0 to MainProcessFileList_ObjectList.Count - 1 do
begin { Tue was mit MainProcessFileList_ObjectList[I] } end;
Delphi-Quellcode:
Das
MaxThreadCount := 8;
FilesPerThread := MainProcessFileList_ObjectList.Count div MaxThreadCount; TParallel.For(FilesPerThread, 0, MainProcessFileList_ObjectList.Count - 1, procedure(Index: Integer) begin { Tue was mit MainProcessFileList_ObjectList[Index] } end);
Delphi-Quellcode:
versteckt sich aktuell noch irgendwo in der Execute Methode deines Threads. Insofern ist das eben nicht egal. Vielleicht passiert innerhalb dieser Methode ja auch etwas, dass diesen Ansatz unmöglich macht oder eine Änderung dessen erfordert, aber das wissen wir nicht.
{ Tue was mit MainProcessFileList_ObjectList[I] }
|
AW: TObjectList-Einträge auf meherere Threads aufteilen
Im Execute meines Threads passiert davor und danach eine ganze Menge. Vor- und Nachbereitungen von Daten. I/O-mäßig passiert da sonst nix mehr.
Kann ich das TParallel.For auch IN den Thread verlagern? Weil mit dem TParallel.For im Hauptthread wird die GUI sonst geblockt. Dafür wären nur wenige Änderungen notwendig und diesen Code der in temporäre Listen auslagert könnte ich komplett löschen. |
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
|
AW: TObjectList-Einträge auf meherere Threads aufteilen
Die Idee mit, das TParallel.For ins Execute auszulagern kam, weil TiGü nach dem Execute gefragt hat.
Ich habe das zum Testen mal ausgelagert. 11 Dateien ergibt Zitat:
Delphi-Quellcode:
TParallel.For(FFileList.Count div 4, 1, FFileList.Count - 1,
10 Dateien werden verarbeitet, die 11. leider nicht. Gibt es hier einen Trick, dass TParallel.For im letzten Durchgang den "Rest" mitnimmt, der bei der Rechnung nicht aufgeht? Ist egal ich bin dumm! Die Zählung muss natürlich bei 0 beginnen, nicht bei 1. Danke an alle. Ich habe jetzt eine Mischung aus allen Vorschlägen. |
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
Du machst dir schon vorher Gedanken über die Lastverteilung. Wenn du die Aufgaben (Dateien) in eine Blocking Collection packst, dann können die Threads sich selbst bedienen, je nachdem ob einer mal schneller oder langsamer ist. Du kannst auch Threads abhängig von der CPU erstellen (lassen) - also nicht gleich auf x festlegen. ___ von 0 auf 100 - Omni Thread Lib (OTL) - Multithreading einfach in Delphi ![]() |
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
|
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
|
AW: TObjectList-Einträge auf meherere Threads aufteilen
Zitat:
Zitat:
Erst dann erzeuge ich einen Thread, der mit der ObjectList (lesend) arbeitet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:21 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz