Ich habe deinen Rat befolgt.
Ich verwende nun 2x TTask.Run();
In jedem dieser rufe ich eine einzige bestimmte Funktion auf, welche durch meine StringListe geht (einige Parameter, zudem Start und Ende der For-Schleife)
Folgendermaßen berechne ich, welcher der beiden Runs was zu bearbeiten hat
Delphi-Quellcode:
run1 := 0;
run2 := 0;
// Beispiel: sl.Count = 5001
for i := 0 to (sl.Count div 2) - 1 do // 0 bis 2500
Inc(run1);
for i := run1 to sl.Count - 1 do // 2501 bis 5000
Inc(run2);
TTask.Run(
procedure
begin
TThread.Queue(nil,
procedure
begin
dummyFunction(param1, param2, ..., 0, run1);
end);
end);
TTask.Run(
procedure
begin
TThread.Queue(nil,
procedure
begin
dummyFunction(param1, param2, ..., run2, sl.Count - 1);
end);
end);
Wenn der zweite Aufruf von dummyFunction fertig bevor der erste fertigist, wartet der zweite Aufruf (Boolean Variable), bis der erste komplett.. komplett.. fertig ist.
Am ende des zweiten Aufrufs wird in dummyFunction() alles zusammengeführt (nur ein paar Zählervariablen).
Vorher brauchte das mit meinen Testdaten 2,1 bis 2,2 Sekunden im Schnitt. Nun bin ich bei 1,4 bis 1,5 im Schnitt.
Ich denke ich werde noch etwas einbauen, dass das TTask.Run nur bei Mehrkernsystemen verwendet wird.
Schöner wär's natürlich, wenn das alles super dynamisch wäre, ohne feste Variablen wie meine booleschen aktuell. Aber das kommt später wenn ich den Durchblick habe.