Schleife zu langsam

Darkas

Erfahrenes Mitglied
Hi!

Ich hab folgendes Problem: ich will eine Datei Binär auslesen, und den Inhalt der Datei in einer RichTextBox ausgeben. Ein Teil meiner Funktion sieht so aus:

Code:
foreach (byte akt in bytes)
            {
                Content.Text += akt;
                Content.Text += " ";
                if (bytecounter == steps)
                {
                    steps += step;
                    progressBar.PerformStep();
                }
                bytecounter++;
            }

Das Problem ist nur: die Funktion ist ziemlich langam. Ich könnte zwar die schleife weglassen, aber dann müsste ich auf die progressBar verzichten. Kennt jemand eine möglichkeit das ganze zu beschleunigen?
 
Wenn Content deine RichTextBox ist, dann hast du eben das Problem, dass bei jedem Hinzufügen die RTB neu gezeichnet wird. Darin liegt dein Performance-Problem.

Also entweder setzt du ein Content.SuspendLayout() vor die Schleife und ein Content.ResumeLayout() nach die Schleife (damit wird die RTB während der Update-Vorgänge nicht aktualisiert), oder du schreibst alles in einen StringBuilder und dessen Wert dann in einem Rutsch in die RTB.
 
Hi

Du solltest auch nicht den +=Operator zum Hinzufügen von Text nutzen (sollte man sowieso nicht zur Stringverkettung). Die RTB bietet die Methode AppendText. Diese macht das ganze performanter und das wichtigste dabei: sie macht es speicherschonender.
 
Warum sollte ich nicht den += Operator verwenden :confused:
Wird das ganze etwa in Content.Text = Content.Text + akt + " "; umgewandelt?

Und warum ist die Content.AppendText(); Methode schneller? Würde mich echt mal interessieren was da drin steht, wenn du das weißt (oder warum sie schneller ist).
 
Also ich hab grad mal das mit Content.SuspendLayout() und ResumeLayout() ausprobiert, aber das scheint nicht zu klappen.
Das ganze sieht jetzt so aus:
Code:
Content.SuspendLayout();
            foreach (byte akt in bytes)
            {
                Content.AppendText(akt + " ");
                if (bytecounter == steps)
                {
                    steps += step;
                    progressBar.PerformStep();
                }
                bytecounter++;
            }
            Content.ResumeLayout(true);
Gibts vielleicht irgendwas was ich vgessen habe?
 
Für was sind denn step und bytecounter? Ruf PerformStep bei jedem Schleifendurchlauf auf und lass die Überprüfungen weg, das würde auch schon was bringen.
(MaxValue ist dann bytes.Length und Step = 1, gilt für die ProgressBar)
 
kann ich nicht, ich weiss ja nicht, wie lang das Array ist. step ist bytes.Length / 10. Damit wird nur bei jedem Zehntel PerformStep aufgerufen (ich könnte auch bei jedem hundertstel machen, aber ich glaub das dauert zu lange)

EDIT: achso, ich kann den MaximalWert der ProgressBar ändern ok, das mach ich gerne :)
 
Hallo,

Warum sollte ich nicht den += Operator verwenden :confused:
Wird das ganze etwa in Content.Text = Content.Text + akt + " "; umgewandelt?

Und warum ist die Content.AppendText(); Methode schneller? Würde mich echt mal interessieren was da drin steht, wenn du das weißt (oder warum sie schneller ist).

Bei normale Operatoren wird jedes mal ein neuer String im Speicher erstellt.
Wenn Sie allerdings die Append-Methode benutzten wird der aktuelle String bearbeitet.
Deswegen auch immer StringBuilder bei Textverkettungen benutzen.

Gruß ikays.
 
ok, dann verbleibt nur noch das Problem dass Trotz SuspendLayout die RTB immer wieder gezeichnet wird.
 
Zurück