Forum: PC-Programmierung C#: Progressbar optisches "refreshen" erzwingen


von (Gast) (Gast)


Lesenswert?

Hallo!

In einer Schleife wird eine Datei (einige MByte) Zeilenweise gelesen, 
bearbeitet und wieder abgespeichert. Dazu wollte ich einen 
Fortschrittsbalken einblenden.

Um Performance nicht zu bremsen reicht das alle 5% locker aus. Trotz 
nachfolgendem Codeausschnitt wird der Balken oftmals nur selten 
aktualisiert. Wie kann ich meinem Wunsch denn gegenüber .NET2.0/Windows 
mehr Nachdruck verleihen?
1
void lange_Dateiarbeit()
2
{
3
   ...//hier: Zeilenweise_Dateilesen_bearbeiten_abspeichern();
4
   Prozent = (int)((100 * GeleseneZeichen) / Filelength);
5
   if (0 == (Progress % 5))
6
   {
7
      progressBar.Value = Prozent;
8
      progressBar.Refresh();    //Tuts eher zufällig bis seeehr verzögert
9
   }
10
}

von (Gast) (Gast)


Lesenswert?

PS.
Kleiner Tipfehler beim Bearbeiten für's Forum unterlaufen:
"Prozent" und "Progress" ist im Originalcode natürlich ein und dieselbe 
Variable...

von Tut nichts zur Sache (Gast)


Lesenswert?

Versuch's doch mal mit Application.DoEvents nach dem Refresh

von JasonDelife (Gast)


Lesenswert?

// Ich weiß, das der Beitrag schon seehr lange her ist, aber:

Du berechnest:
   Prozent = (int)((100 * GeleseneZeichen) / Filelength);

Ist die Berechnung nicht aber (Mathematisch): p = (W/G) * 100
Also:
   Prozent = (int)((GeleseneZeichen / Filelength) * 100);


Ist mir jetzt nur so aufgefallen.
Grüße,
JasonDelife.

von Karl H. (kbuchegg)


Lesenswert?

Die Chancen das sowohl GeleseneZeichen als auch Filelength als Integer 
Datentyp definiert sind, sind in diesem Beispiel ziemlich hoch.
Da GeleseneZeichen aber aller Wahrscheinlichkeit nach, nicht größer als 
Filelength werden kann, ist das Ergebnis der Division GeleseneZeichen / 
Filelength damit immer 0, bzw. 1 wenn GeleseneZeichen == Filelength

Mathematisch gesehen sind die Ausdrücke

((100 * GeleseneZeichen) / Filelength)

und

((GeleseneZeichen / Filelength) * 100)

allerdings völlig gleichwertig.
Im Computer leider nicht.

von Simon K. (simon) Benutzerseite


Lesenswert?

Prozent = (int)((100 * GeleseneZeichen + Filelength/2) / Filelength);

Um es auch richtig zu runden ;)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.