Zitat:
Bei SSDs könnte man auch beim Lesen der Dateien parallele Zugriffe versuchen, aber auch nicht unbeschränkt viele, da kommt es auf die Größe der Dateien an wo hier Optimierungspotential ist.
Man könnte auch mit MMFs arbeiten um Windows so eine Optimierung der Zugriffe zu ermöglichen, wenn es sich um große Dateien handelt.
Ich lese keine Dateien. Es geht nur um die Aufteilung der Listen.
Ich kann euch ja mal meinen absolut scheuslichen Code zeigen. Dann versteht ihr, warum ich hier nachfrage.
An der Sache mit den Threads kann ich nichts ändern. Es geht nur um die Aufteilung / Zuweisung in die Threads/Erstellung der Threads
Delphi-Quellcode:
MaxThreadCount := 8;
FilesPerThread := MainProcessFileList_ObjectList.Count div MaxThreadCount;
SetLength(TmpFileLists_ObjectList, MaxThreadCount);
for i := 0 to MaxThreadCount - 1 do
begin
try
if MainProcessFileList_ObjectList.Count >= FilesPerThread then
begin
TmpFileLists_ObjectList[i] := TObjectList<TFileEntry_CopyProcess>.Create;
TmpFileLists_ObjectList[i].OwnsObjects := False;
TmpFileLists_ObjectList[i].Clear;
iCnt := FilesPerThread;
for j := 0 to iCnt - 1 do
begin
TmpFileLists_ObjectList[i].Insert(j, MainProcessFileList_ObjectList.Items[j]);
end;
for j := iCnt - 1 downto 0 do
begin
MainProcessFileList_ObjectList.Delete(j);
end;
// Thread erstellen
if TmpFileLists_ObjectList[i].Count > 0 then
begin
createCopyThread(TmpFileLists_ObjectList[i], ..., ...); // ERSTELLUNG DES THREADS MIT DEM REST DER IN TmpFileLists_ObjectList DRIN IST
end;
end
else
Break;
except
// Mache dies und das im Fall des Falles
end;
end; // for
// Wenn noch Dateien "übrig" bleiben (z.B. bei 130 Dateien, 8 Threads bleiben 2 Dateien "übrig")
if (MainProcessFileList_ObjectList.Count > 0) then
begin
// Thread erstellen
createCopyThread(TmpFileLists_ObjectList[i], ..., ...); // ERSTELLUNG DES THREADS MIT DEM REST DER IN TmpFileLists_ObjectList DRIN IST
for i := MainProcessFileList_ObjectList.Count - 1 downto 0 do
begin
MainProcessFileList_ObjectList.Items[i].Free;
MainProcessFileList_ObjectList.Delete(i);
end;
end;
Zitat:
TParallel.For hat eine Überladung mit einem Stride Parameter. Damit ließe sich das im genannten Beispiel so lösen:
Wofür ist denn das Low- und HighInclusive?
Low = einfach 1 und High = Anzahl der Dateien?
In meinem Fall also?
Delphi-Quellcode:
TParallel.For(MainProcessFileList_ObjectList.Count div MaxThreadCount, 1, MainProcessFileList_ObjectList.Count,
procedure(Index: Integer)
begin
// Bearbeite Listeneintrag[Index]
end);
Dieses Parallel.For verstehe ich noch nicht so richtig. Wie packe ich die Listeneinträge jetzt in einen Thread? Also bei 125 Dateien 16 Dateien pro Thread?
createCopyThread() darf ich in diesem Fall nur 8x aufrufen.
createCopyThread erwartet als letzten Parameter "IsLastThreads: Boolean". Ich muss also auch irgendwie rausfinden, welcher der letzte Thread ist.
Wie mache ich das alles mit TParallel.For? Kann man meinen Code ansonsten irgendwie verbessern: