Progress Bar

Kanonenfutter

Mitglied
Hallo
Ich habe ein Programm, welches in einer Scheife eine Datei als Byte in eine TextBox schreibt (wollte das nur mal probieren :) ), bei großeren Dateien dauert dies jedoch ziemlich lang. Daher wollte ich eine Progress Bar in einer 2. Form einbauen, die den Status anzeigt. Nur reagiert das Programm, wenn es in die Schleife kommt, nicht mehr, und die Progress Bar bleibt leer. Kann ich irgendwie in der Schleife so etwas wie einen "Warte-Punkt" einbauen, damit die Progress Bar etwas anzeigt?
Code:
public int progress=0;  //<-- Progress Bar holt sich von progress die %
private void menuItem2_Click(object sender, System.EventArgs e)
{
	byte[] data;
	if(openFileDialog1.ShowDialog()==DialogResult.OK)
	{
		System.IO.BinaryReader br = new System.IO.BinaryReader(openFileDialog1.OpenFile());
		data=br.ReadBytes(Convert.ToInt32(openFileDialog1.OpenFile().Length));
		string m="";
		Form2 f2=new Form2(this);
		f2.Show();
		for(int i=0; i<data.Length; i++)
		{
			m+=data[i].ToString()+"\t";
			progress=Convert.ToInt32(100/Convert.ToDouble(data.Length)*i);
		}
		textBox1.Text=m;
	}
}
 
Zuletzt bearbeitet:
Wenn ich dich richtig verstanden habe errechnest du in der Schleife, die du abgebildet hast, den Stand der ProgressBar, die in einer anderen Form beheimatet ist.

Wenn dem so ist, hast du etwas nicht bedacht:
Woher soll deine ProgressBar wissen, dass sich was in deiner anderen Form verändert hat?

Um ihr das mitzuteilen müsstest du dir ein Ereignis bauen und dieses dann immer auslösen, wenn du möchtest, dass deine ProgressBar einen Schritt macht.


class PerformStepEventArgs : System.EventArgs
{
public PerformStepEventArgs()
{
}
}

Das ist deine Ereignisklasse. Keine Angst mehr braucht es da nicht.
So, in der Form in der du die Schleife ausführst, muss als globale Deklaration folgendes rein:

public delegate void PerformStepEventHandler(object sender, PerformStepEventArgs e);
public event PerformStepEventHandler PerformStep;

Jetzt kannst du in deiner Schleife das Ereignis auslösen:

PerformStep(this, new PerformStepEventArgs());

Nun musst du das Ereignis noch in der Form mit der ProgressBar abfangen.
Das könnte etwa so aussehen:

// EventHandler Methode anmelden
this.FormMitSchleife.PerformStep += new PerformStepEventHandler(this.bewegeProgressBar);

.....

// EventHandler Methode implementieren
private void bewegeProgressBar(object sender, PerformStepEventArgs e)
{
this.progressBar.PerformStep();
}


Ich hoffe mal das war jetzt nicht zu viel für dich

Gruß Swebble
 
wegen der Veränderung: Ich habe es getestet, indem ich in gewissen Schritten MessageBoxen anzeigen lasse. Dabei hat sich der Wert der ProgressBar verändert, das heisst ich muss kein event verwenden.
Code:
for(int i=0; i<data.Length; i++)
{
	m+=data[i].ToString()+"\t";
	progress=Convert.ToInt32(100/Convert.ToDouble(data.Length)*i);
	if(i%50==0)  //wenn durch 50 teilbar ist, dann "Pause"
	{
		MessageBox.Show("");
	}
}
Das Problem ist, dass bei größeren Dateien die Rechnerleistung auf 99% ansteigt, das Programm somit nicht mehr reagiert, und auch nichts angezeigt wird.
 
Entweder kannst du diesen Vorgang in einem seperaten Thread starten oder du verwendest, die Prozedur Windows.Forms.Application.DoEvents() .
Diese führt alle Ereignisse, die das Formular erhalten aus und setzt den aktuellen Vorgang nacher fort. Das musst du irgendwie einbauen. vielleicht alle 1000 Byte. Ich weiss nicht wie schnell dein Programm arbeitet.
 

Neue Beiträge

Zurück