![]() |
AW: Generelle Fragen zu TParallel.For
Irgendetwas stimmt da mit meiner Zahlenkunst aber noch nicht.
Wenn ich eine StringListe mit 10 Einträgen habe:
Delphi-Quellcode:
Nur wie müssen dann die Schleifen aussehen, die die Variablen hochzählen? :roll:
{*
=> sl.Count = 10 Einträge 1: - 0 bis (sl.Count-1) div 2 == 0 bis 4 (5 Strings) 2: - 4+1 bis (sl.Count-1) == 5 bis 9 (5 Strings) *}
Delphi-Quellcode:
Das hier ergibt "0 bis 5" und "5 bis 9".
for i := 0 to ((sl.Count) div 2) - 1 do
Inc(run1); for i := run1 to sl.Count - 1 do Inc(run2); ShowMessage('Von ' + IntToStr(0) + ' bis ' + IntToStr(run1) + sLineBreak + 'Von ' + IntToStr(run2) + ' bis ' + IntToStr(sl.Count - 1)); Bei ungeraden Zahlen (11 Einträge) ist es korrekt. |
AW: Generelle Fragen zu TParallel.For
In der ersten Schleife zählst Du von 0 bis zum berechneten Wert.
Mit diesem Wert beginnst Du die zweite Schleife. Die müsste aber beim ersten Wert hinter dem Ende der ersten Schleife beginnen. Müsste es nicht eher so aussehen?
Delphi-Quellcode:
program Test;
var i : Integer; run1 : Integer; run2 : Integer; sl : TStringList; begin sl := TStringList.Create; for i := 0 to 100 do sl.Add(''); run1 := 0; run2 := 0; for i := 0 to (sl.Count div 2) do Inc(run1); for i := (run1 + 1) to sl.Count - 1 do Inc(run2); ShowMessage('Von ' + IntToStr(0) + ' bis ' + IntToStr(run1) + #13#10 + 'Von ' + IntToStr(run1 + 1) + ' bis ' + IntToStr(sl.Count - 1)); sl.Free; end. |
AW: Generelle Fragen zu TParallel.For
Dein Ansatz funktioniert.
Folgender funktioniert auch Beides scheint aber nicht perfekt zu funktionieren.
Delphi-Quellcode:
iTmp := -1;
iTmpEx := 0; slMidIndex := slSource.Count div 2; // center of list's items slHighIndex := slSource.Count - 1; // end of list for i := slMidIndex to slHighIndex do Inc(iTmp); for i := slHighIndex downto slMidIndex do Inc(iTmpEx); ShowMessage('Von ' + IntToStr(0) + ' bis ' + IntToStr(iTmp) + sLineBreak + 'Von ' + IntToStr(iTmp + 1) + ' bis ' + IntToStr(slHighIndex)); // 9 Einträge // Von 0 bis 4 // Von 5 bis 8 // 10 Einträge // Von 0 bis 4 // Von 5 bis 9 // 11 Einträge // Von 0 bis 5 // Von 6 bis 10 // http://stackoverflow.com/questions/9211772/how-to-split-one-stringlist-into-two-string-lists-in-delphi |
AW: Generelle Fragen zu TParallel.For
Nein, der Startwert der zweiten Schleife muss um eins größer sein, als der Endwert der ersten Schleife, andernfalls sind der letzte Wert der ersten For-Schleife und der Startwert der zweiten For-Schleife identisch und es wird ein Verarbeitungsschritt zweimal durchgeführt.
Bei Deiner derzeitigen Variante wird zweimal die obere Hälfte der Liste verarbeitet. Einmal von der Mitte bis zum Ende und einmal vom Ende bis zur Mitte. Die Ausgabe suggeriert jedoch, es würden beide Hälften verarbeitet. |
AW: Generelle Fragen zu TParallel.For
Ein paar Tests von mir (10 Dateien eines Verzeichnisses kopieren) sind bisher alle ohne Fehler.
|
AW: Generelle Fragen zu TParallel.For
Zitat:
|
AW: Generelle Fragen zu TParallel.For
Zitat:
Zusätzlich wird mir vorher die fertige Liste angezeigt. |
AW: Generelle Fragen zu TParallel.For
Diese beiden Schleifen
Delphi-Quellcode:
durchlaufen beide denselben (oberen) Index-Bereich, nur anders herum. Der untere Teil von 0 bis slMidIndex - 1 wird gar nicht abgedeckt. Andererseits zählst du in diesem Beispiel auch nur zwei Zähler hoch und greifst nicht auf die Einträge der Liste zu. Am Ende interpretierst du dann aber die Endwerte der Zähler als etwas, das sie gar nicht sind.
for i := slMidIndex to slHighIndex do
Inc(iTmp); for i := slHighIndex downto slMidIndex do Inc(iTmpEx);
Delphi-Quellcode:
ShowMessage('Von ' + IntToStr(0) + ' bis ' + IntToStr(iTmp) + sLineBreak + 'Von ' + IntToStr(iTmp + 1) + ' bis ' + IntToStr(slHighIndex));
Dabei stellt iTmp aber lediglich die Anzahl Durchläufe der ersten Schleife dar. Das deckt sich aber nicht mit der Meldung in ShowMessage. Der Code, den du hier zeigst, ist ganz offensichtlich nicht der, den du ausführst. Ehrlich gesagt, verstehe ich überhaupt nicht, wo das Problem ist. Das Splitten einer Liste in zwei nahezu gleich große Teile ist doch wirklich trivial. |
AW: Generelle Fragen zu TParallel.For
Zitat:
Auch wenn es sehr trivial zu sein scheint, bekomme ich es anders nicht hin :( nahpets' Lösung scheint aber doch richtig zu sein oder? Zitat:
|
AW: Generelle Fragen zu TParallel.For
Was soll eigentlich das Hochzählen irgendwelcher Variablen bezwecken? Geht es nicht einzig darum, eine Liste in zwei separaten Schleifen zu durchlaufen, wobei
Dazu errechnet man die ungefähre Mitte (bei ungerader Anzahl geht das nicht genau auf):
Delphi-Quellcode:
Dann lässt man die eine Schleife von
(sl.Count div 2)
Delphi-Quellcode:
bis
0
Delphi-Quellcode:
laufen und die zweite von
(sl.Count div 2) - 1
Delphi-Quellcode:
bis
(sl.Count div 2)
Delphi-Quellcode:
.
slCount - 1
Mir ist nicht ganz klar, warum in deinem Beispiel die zweite Schleife bei
Delphi-Quellcode:
loslegt. Das ergibt doch gar keinen Sinn. Was hat der Zähler
run1 + 1
Delphi-Quellcode:
mit den Schleifengrenzen bzw. der Aufteilung der Schleifen zu tun?
run1
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:37 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-2025 by Thomas Breitkreuz