ProgressBar Flackert immer beim Programm ablauf

Ich hab mir den ganzen Code jetzt nicht angesehen, aber vielleicht nach dem Setzen des Values für deine ProgressBar ein einfaches Application.DoEvents() rein.
 
Hallo, vielen Dank für eure Mühe. Das mit dem Doevent habe ich eben schnell ausprobiert, leider ohen Erfolg. Es verändert nichts an der Tatsache das value sich nicht wieer auf 0 setzt.
Hier mein Code:
Code:
using (BinaryReader reader = new BinaryReader(fstream))
{
int b = 0;
bool gesetzt = false;
while (s_length > s_read)
{
pb1.Value = b;
byte[] buffer = new byte[1024];
int read = reader.Read(buffer, 0, 1024);
s_read += read;
sendBuffer(stream, buffer, read);
int pc = (int) ((((double)s_read) / ((double)s_length)) * 100);
tb1.Text = pc + "% Gesendet!";
if (pc % 10 == 0)
{
if (gesetzt == false)
{
pb1.Value =pc;
Application.DoEvents();
gesetzt = true;
MessageBox.Show("test" + pc); // wenn ich das hier mache wird es Angezeigt, allerdings 
//nur bis ich auf OK klicke.
}
}
Ich hoffe ihre habt noch ein paar Ideen, woran es liegen könnte.

Vielen Dank nocheinmal für eure Hilfe und Mühe
Grüße
Fridulin

 
Du hast eine Bedingung in der du abfragst ob gesetzt false is. Gehst du rein, dann setzt du true und ab dann läuft er nie mehr in diese Bedingung hinein.

Und wann soll sich das Ding auf 0 setzen? Also zu welchem Zeitpunkt soll das passieren?
 
Hi, danke für deine schnelle Antwort. Auf 0 wird nichts gesetzt, nur in der ProgressBar sie wird zuerst einmal gesetzt und dann Zeigt sie es einmal an also geht der Fortschrittsbalken hoch und sofort wieder auf 0. Ich hätte das garnicht mitrbekommen, normal geht es so schnell das der Fortschrittsbalken also die ProgressBar garnihcts anzeigt, nur wenn ich direkt hinter der ProgressBar ne MessageBox setze, dann sehe ich das sie kurz gesetzt ist und sobald ich die MessageBox wieder schließe, also das Programm weiter laufen lasse ist sie wieder auf 0.
Ich habe echt keine Ahnung warum das so ist.

Grüße und Vielen Dank noch einmal.
Fridulin


--- Edit ---

Der folgende Code habe ich natürlich z.Z nur zu testzwecken
Code:
if (gesetzt == false)
{
pb1.Value =pc;
Application.DoEvents();
gesetzt = true;
MessageBox.Show("test" + pc); // wenn ich das hier mache wird es Angezeigt, allerdings 
//nur bis ich auf OK klicke.
}
Weil wenn ich den nicht Benutze, also sprich nur den Value setze, dann Flackert die Progressbar. Das kommt daher, weil sie zu schnell und zu oft immer gesetzt wird, denke ich. Da wenn ich in den if eine MessageBox hintregiere, dann wird sie mehr als 30 mal schnell geöffnet obwohl ich auch nur Probiert hatte wenn pc = 10 ist einmal reinzuspringen. Sprich pc ist 10, auch wenn die while Schleife ca.30 mal durchläuft. Erst dann ändert sich der Wert. Also wird, schätze ich, wie schon erwähnt die ProgressBar zu oft Sprich zu schnell gesetzt. Oder lieg ich da jetzt falsch?

Grüße
 
Zuletzt bearbeitet:
Poste doch mal die ganze Methode, denn auch das using hast du nicht vollständig gepostet. Entweder fehlt da noch ein } oder es fehlt samt Code dahinter.
 
So hier die Gesamte.
Code:
if (msg.Equals(bestaetigung))
{
FileStream fstream = File.Open(path, FileMode.Open, FileAccess.Read, 
ileShare.ReadWrite);
long s_length = fstream.Length;
long s_read = 0;
using (BinaryReader reader = new BinaryReader(fstream))
{
int b = 0;
bool gesetzt = false;
while (s_length > s_read)
{
pb1.Value = b;
byte[] buffer = new byte[1024];
int read = reader.Read(buffer, 0, 1024);
s_read += read;
sendBuffer(stream, buffer, read);
int pc = (int) ((((double)s_read) / ((double)s_length)) * 100);
tb1.Text = pc + "% Gesendet!";
if (pc % 10 == 0)
{
if (gesetzt == false)
{
pb1.Value =pc;
//MessageBox.Show(pc.ToString());
Application.DoEvents();
gesetzt = true;
MessageBox.Show("test" + pc);
}
}
else {
gesetzt = false;
}
}
}
stream.Flush();
tb1.Text = "Datei erfolgreich Gesendet!";
}
else
tb1.Text = "Datei wurde nicht Akeptiert";
stream.Close();
client.Close();
}
catch {
MessageBox.Show("Aus mysteriösen Gründen kann ich den Datei Empfänger nicht 
inden", "Fehler, Verbindung leider Fehlgeschlagen :[");
}
}
Vielen Danke für deine Mühe, der Rest ist uninteressant da wird nur der TcpClient erstellt und so weiter für das letzendliche using BinaryReader.
 
Zuletzt bearbeitet:
Fridulin,

wenn du sagst das die Schleife so schnell durchläuft das du den Balken nur siehst wenn du vorm erreichen des Max Wertes eines MSGBOX einblendest .. wozu dann ne Progressbar ? Sowas macht man doch nur wenn eine Aktion Zeit in Anspruch nimmt um dem Benutzer zu zeigen wie lange es noch noch dauert.
Kein Wunder wenn die Schleife so schnell ist das es flackert. Lass die Progressbar weg oder verlangsame die Schleife wenn du unbedingt nen wandernden Balken sehen willst.

Jens
 
Hi, Danke für deine Antwort. Da haben wir uns wohl mißverstanden. Ich ich sagte das die Schleife so schnell durchläuft, sagen wir 30 mal bis sich der Wert der ProgressBar erhöht. Das hat zur Folge das der Wert der ProgressBar 30 mal der gleiche ist bis er sich ändert und um 1 hochsteigt. Der Wert der sich nach 30 durchlaufen ca. erhöht ist ein Prozentualer Wert, jenachdem wie Groß die Datei ist muß die ProgressBar schnell oder jenachdem langsam ansteigen. Was ja auch alles wunderbar funktioniert, eben wie gesagt bis auf das flackern, weil sie so schnell, denke ich) gefüttert wird zum Teil auch mit den gleichen Wert (30 mal ca. bis sich der Wert ändert), daß sie somit anfänngt zu flackern.

Ich habe wie du im programm Code sehen kannst auch schon Probiert die Schleife immer nur 1 mal aufrufen zu lassen, wenn sich der Wert erhöhen soll, dies geschieht auch allerdings ist der Wert dann immer nur so kurz gesetzt das es fürs Auge unsichtbar ist. Nur wenn ich das Programm mit einer MessageBox an der Stelle anhalte wo die ProgressBar sich erhöht sehe ich in der Progressbar den Wert danach setzt sie sich komischerweise, immer wieder auf 0 zurück.

Grüße und ich hoffe du hast mich jetzt besser verstanden udn natürlich vielen Dank für deine Hilfe
Fridulin
 
Hi.

Wenn du ein Snippet postest, bitte achte darauf, dass du die Formatierung mit rein bekommst, also damit meine ich Tabs oder Leerzeichen, ansonsten ist es unerträglich zu lesen. Ausserdem paste deine Snippets so, dass die öffnenden und schließenden Klammern zusammenpassen, macht auch einiges leichter.

Code:
if (msg.Equals(bestaetigung))
{
  FileStream fstream = File.Open(path, FileMode.Open, FileAccess.Read, fileShare.ReadWrite);
  long s_length = fstream.Length;
  long s_read = 0;

  using (BinaryReader reader = new BinaryReader(fstream))
  {
    int b = 0;
    bool gesetzt = false;
    while (s_length > s_read)
    {
      pb1.Value = b;
      byte[] buffer = new byte[1024];
      int read = reader.Read(buffer, 0, 1024);
      s_read += read;
      sendBuffer(stream, buffer, read);
      int pc = (int) ((((double)s_read) / ((double)s_length)) * 100);
      tb1.Text = pc + "% Gesendet!";
      if (pc % 10 == 0)
      {
        if (gesetzt == false)
        {
          pb1.Value =pc;
          //MessageBox.Show(pc.ToString());
          Application.DoEvents();
          gesetzt = true;
          MessageBox.Show("test" + pc);
        }
      }
      else
      {
        gesetzt = false;
      }
    }
  }
}

Schau dir mal die roten Zeilen an, was fällt dir auf?

MfG,

Alex
 

Neue Beiträge

Zurück