Laden...

Im GUI warten, bis externer Prozess beendet

Erstellt von ZeroQool vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.395 Views
Z
ZeroQool Themenstarter:in
322 Beiträge seit 2006
vor 16 Jahren
Im GUI warten, bis externer Prozess beendet

Hallo. folgendes Problem worauf keine passende Antwort zu finden ist

Ich starte den Prozess

        System.Diagnostics.Process.Start(@"""" + Application.StartupPath + @"\Rar.exe" + @"""", " x -ibck -o+ " + txtB_QuellverzeichnisRAR.Text + " " + txtB_ZielverzeichnisUnternehmen.Text);

hier wird ein RAR Archiv entpackt. Nun möchte das solange das RAR noch entpackt wird, alle buttons ect disabled werden.

Habe das probiert:

        while (Process.GetProcessesByName("rar").Length > 1)
        {
          GrpB_Datenbank.Enabled = false;
          GrpB_VerzeichnisPortKonfig.Enabled = false;
          btn_Abbruch.Enabled = false;
          btn_Uebernehmen.Enabled = false;
          MessageBox.Show("");
        }

Aber es funktioniert nicht, weil er den Prozess nicht findet, weil bei der While Schleife anscheinend noch nicht gestartet ist. Wenn ich zB noch eimal auf den Entpacken Button drücke springt er in meine While Schleife.

Gibt es noch eine andere Möglichkeit?

915 Beiträge seit 2006
vor 16 Jahren

Okay, kurz zur erklärung bevor es die Lösung dazu gibt 😉

Dein Problem ist folgendes, du startest zwar über Process.Start deinen Prozess, darfst aber deswegen noch nicht davon ausgehen das dein Prozess schon läuft. Stell dir einfach vor du würdest auf eine Anwendung doppelklicken, bis die Anwendung startet dauert es immer eine gewisse Zeitspanne. Und genau das hast du zwar versucht zu lösen aber etwas falsch 😮)

Eine DoNothing Schleife wie deine, erwartet ein "true" um weiter vortzufahren erhällt aber wegen der Verzögerung immer ein "false". Beim zweiten mal wiederum wird sie true und blockiert dann deine GUI und spamt ne MessageBox die nach dem schließen wieder geöffnet wird usw. 😛

Klar du könntest das jetzt wie folgt lösen indem du ne while(true) Schleife gestalltest in einem Thread, der dann nen break oder return auslöst sobald Process.GetProcessesByName("rar").Length > 1 wäre und würdest damit deine Buttons aktivieren oder deaktivieren können.

Aber schick wäre das ganze noch nicht. Ich hab dir hier nen Linkauf ein ähnliches Problem. Zur Lösung deines Problems nutzt du genau das selbe Verfahren. Und da du den Prozess ja selbst gestartet hast und somit auch die ProzessId besitzt kannst du beim Aktivieren eines neuen Prozesses schauen, ob die ProzessId vom neuen Prozess auch wirklich der von deinem Prozess entspricht. Und somit wäre die Anwendung sauberer gelöst, als durch eine DoNothing Schleife.

Ausserdem wird die DoNothing Schleife irgendwann mal ins Endlose laufen da es beim direkten Entpakungsvorgang auch schonmal passieren kann das die Anwendung von Win RAR abschmiert... naja war früher mal zumindest so vielleicht kommt ja nun ne lustige Fehlermeldung die dir ja ausreichen würde.

Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo ZeroQool,

busy waiting (hier: while) ist meist ungünstig und unnötig. Im GUI darfst du solche Konstruktionen schon gar nicht benutzten. Siehe [FAQ] Warum blockiert mein GUI?

Es geht viel einfacher: Starte den Prozess und warte auf Process.Exited.

herbivore