Entwickler-Ecke

WinForms - Progressbar als Fortschrittsanzeige eines Prozesses


BennyM85 - Mi 18.03.09 13:13
Titel: Progressbar als Fortschrittsanzeige eines Prozesses
Hallo Leute,

ich hab jetzt ne Weile im Netz und auch bei MS geguckt, aber für mich nichts richtig brauchbares gefunden.
Ich möchte gerne Programme installieren nach Aufruf eines Buttons (funktioniert schon) und dann die Prozessbar aktualisieren, dass er mir sozusagen anzeigt wieviel Prozent er vom gesamten Programmeinstallieren schon fertig hat.

hier ist die Installfunktion

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
 private void install(string programm, string parameter)
        {
            lblStatus.Visible = true;
            string myProgramsPath = Application.StartupPath;
            proc.StartInfo.FileName = myProgramsPath + "\\" + programm;
            proc.StartInfo.Arguments = parameter;
            proc.StartInfo.CreateNoWindow = true;
            proc.Start();
            installed++;
            progressBar1.Value = (100 * installed) / anzahl;
            progressBar1.Update();
            lblProzent.Text = progressBar1.Value.ToString("00")+"%";
            proc.WaitForExit();
        }


ich übergebe ihm eine exe datei und die parameter, wie gesagt installieren geht,
danach starte ich die Installation des Programms über proc.Start() und zähle die Anzahl der installierten Programme (installed++) eins hoch
nur mit den zwei zeilen mit der progressbar weiß ich nicht wie ich das global lassen laufen kann. stimmt die Berechnung?
Anzahl ist die Anzahl der zu installierenden Programme.

Ein weiteres Problem ist noch, dass während die Programme nacheinander installiert werden, ich nicht mehr ordentlich auf die GUI zugreifen kann, bzw. wenn ich ein Installationsfenster verschiebe während der installation, dann bleibt wird die GUI mit dem Installationsfenster weiterhin übermalt, sodass diese nicht vernünftig ausschaut.
Ich kann ja falls gewünscht einen Screenshot davon reinstellen....

Ich hoffe ihr könnt mir helfen.
LG Benny

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Dave86 - Mi 18.03.09 13:18

Hi Benny.

Zum Thema dass die GUI hängen bleibt, dass liegt wahrscheinlich daran, dass du die Installationsroutine nicht in einem eigenen Thread laufen lässt, wodruch der GUI Thread dann solange blockiert ist, bis deine Funktion alle Programme installiert hat.

Das mit dem global laufen lassen versteh ich noch nicht ganz...

Grüße
Dave


BennyM85 - Mi 18.03.09 13:30

Also das mit den Threads ist eine gute Idee... das müsst ich mal so lösen

jetzt zu den Programmen:
ich hab ne oberfläche gebastelt mit checkboxen wo man ankreuzen kann, was alles installiert werden soll.
ich lass ihn dann zusammenzählen wieviele programme installiert werden und fange dann an diese zu installiern.
angenommen ich installiere jetzt 10 Programme dann möchte ich dass er nach jeder Programminstallation den fortschrittsbalken um 10 Prozent erhöht. für diesen fall wäre einfach; jetzt ist die anzahl der zu installierenden Programme ja dynamisch.

ist die formel richtig: (anzahl schon installierter Programme / Anzahl zu installierende Programme) * 100

Muss die Progressbar auch im eigenen Thread laufen?


Dave86 - Mi 18.03.09 13:36

Hi Benny.

Schau dir mal die Eigenschaften des Progressbar an, da gib es eine MinValue und MaxValue eigenschaft.
Das einfachste ist du sagst zu beginn

C#-Quelltext
1:
progressbar.Maximum = anzahl_install_programme;                    


und bei jedem durchlauf

C#-Quelltext
1:
progressBar1.Value++;                    

das funktioniert aber nur wenn der Progressbar auch im gleichen Thread läuft.

Wenn du deine Installationsroutine in einen eigenen Thread laufen lässt, musst du mit delegates arbeiten

Hoffe ich konnte weiterhelfen.

Grüße
Dave

Moderiert von user profile iconChristian S.: Code- durch C#-Tags ersetzt


Kha - Mi 18.03.09 13:44

@BennyM85: Schau dir mal die BackgroundWorker-Klasse an, dein Problem ist quasi das Paradebeispiel für ihre Benutzung.


BennyM85 - Mi 18.03.09 14:37

thx, das war des rätsels lösung^^