Visual Basic - Select Case - Update Status Bar
Hallo zusammen,
ich habe folgende Methode:
Dort möchte ich in jedem Case am Anfang und Ende die Status Bar dementsprechend Updated.
Jedoch scheint er den ersten Befehl nicht auszuführen. Die Statusbar bleibt unverändert, sobald ich auf den Button klicke.
Erst nachdem der Shell Befehl durchlaufen ist, Updated er die Status Bar mit dem "Abgeschlossen".
Ich frage mich also jetzt warum er das so macht, er müsste doch theoretisch den UpdateStatusBar Befehl erst ausführen, bevor er in den Shell Befehler samt "wait = true" geht?
Oder habe ich da vergessen was zu beachten?
Vielen Dank im Voraus
ich habe folgende Methode:
Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
Try
Select Case ComboBoxDebug.SelectedItem.ToString
Case ComboBoxDebug.Items(0).ToString ' Einnahmeverwaltung
UpdateStatusBar("Warnung", "Einnahmeverwaltung wird ausgeführt...")
Dim Pfad As String = Application.StartupPath & "\Skripts\Einnahmeverwaltung.ps1"
Shell("powershell.exe " & Pfad, , True)
UpdateStatusBar("OK", "Einnahmeverwaltung abgeschlossen")
MessageBox.Show("Einnahmeverwaltung wurde ausgeführt", "Einnahmeverwaltung",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
Case ComboBoxDebug.Items(1).ToString ' Zahllauf Teil 1
UpdateStatusBar("Warnung", "Zahllauf Teil 1 wird ausgeführt...")
Dim Pfad As String = Application.StartupPath & "\Skripts\Zahllauf.ps1"
Shell("powershell.exe " & Pfad, , True)
UpdateStatusBar("OK", "Zahllauf Teil 1 abgeschlossen")
MessageBox.Show("Zahllauf Teil 1 abgeschlossen", "Zahllauf - Prüfläufe",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
Case ComboBoxDebug.Items(2).ToString ' Zahllauf Teil 2
UpdateStatusBar("Warnung", "Zahllauf Teil 2 wird ausgeführt...")
Dim Pfad As String = Application.StartupPath & "\Skripts\ZahllaufTeil2.ps1"
Shell("powershell.exe " & Pfad, , True)
UpdateStatusBar("OK", "Zahllauf Teil 2 abgeschlossen")
MessageBox.Show("Zahllauf Teil 2 abgeschlossen", "Zahllauf - Auszahlung",
MessageBoxButtons.OK,
MessageBoxIcon.Information)
End Select
Catch ex As Exception
MessageBox.Show(ex.ToString())
End Try
End Sub
Dort möchte ich in jedem Case am Anfang und Ende die Status Bar dementsprechend Updated.
Jedoch scheint er den ersten Befehl nicht auszuführen. Die Statusbar bleibt unverändert, sobald ich auf den Button klicke.
Erst nachdem der Shell Befehl durchlaufen ist, Updated er die Status Bar mit dem "Abgeschlossen".
Ich frage mich also jetzt warum er das so macht, er müsste doch theoretisch den UpdateStatusBar Befehl erst ausführen, bevor er in den Shell Befehler samt "wait = true" geht?
Oder habe ich da vergessen was zu beachten?
Vielen Dank im Voraus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 480870
Url: https://administrator.de/forum/visual-basic-select-case-update-status-bar-480870.html
Ausgedruckt am: 22.04.2025 um 04:04 Uhr
8 Kommentare
Neuester Kommentar
Frage nebenbei, warum musste in diesem Fall das Application.DoEvents dazu?
damit neu gezeichnet wird... https://docs.microsoft.com/de-de/dotnet/api/system.windows.forms.applica ...
Weil Du im Shell-Kommando angegeben hast, dass er auf die Beendigung des Befehls warten soll. Weil Du das aber in einem Control-Eventhandler des Formulars machst, bremst/blockierst Du damit die Abarbeitung andere Control-Events in diesem Formular, z.B. das Neuzeichnen des Text des Statuslabels bei Änderung des Texts. Mit dem DoEvents weist Du die Anwendung explizit an, anderen Events kurz Aufmerksamkeit zu schenken und diese ggf. abzuarbeiten.
Aber Vorsicht: Das DoEvents sollte man nicht zu exzessiv nutzen, weil es sonst u.U. das Programm ausbremst.
Aber Vorsicht: Das DoEvents sollte man nicht zu exzessiv nutzen, weil es sonst u.U. das Programm ausbremst.

Jepp und deswegen verlagert man solche Aktionen wie länger andauernde Prozesse normalerweise in separate Threads aus und lässt sich über den Status mit üblicherweise über Eventhandler informieren.
Ich bin mir nicht sicher, ob du die Funktionsweise von Threads verstanden hast, aber hier mal ein simples Beispiel:
https://youtu.be/KK5D4Y2fnl4
https://youtu.be/KK5D4Y2fnl4
Zitat von @Pat.bat:
ich muss hier nochmal nachfragen: Wie genau lagere ich Prozesse in seperate Threads aus?
Gar nicht. Prozesse sind Prozesse und Threads sind Threads. Ein Prozess kann in mehreren Threads laufen. Jeder Prozess läuft in seinen/m eigenen Thread/s.ich muss hier nochmal nachfragen: Wie genau lagere ich Prozesse in seperate Threads aus?
Mir kommt das in letzter Zeit öfters vor, das ich Prozesse habe, die etwas länger brauchen und in der Zeit kann man weder das Fenster verschieben noch irgendwelche Buttons wie zb. Abbrechen drücken. Daher denke ich, das diese es helfen würde solche Prozesse auszulagern.
Nennen wir es: Aktivitäten in mehreren Threads parallel ausführen. Suchbegiffe wären "multithreading" oder u.u. auch "parallel processing"Allerdings habe ich damit bis jetzt noch keine Erfahrung.
Dann fange klein an.Suche nach und probiere mit:
- System.Threading.Thread
- System.Threading.Tasks
- System.ComponentModel.BackgroundWorker
- Control.BeginInvoke
Wenn Du viel mit Formularen arbeitest, dann solltest Du Dir mal den BackgroundWorker ansehen. Auch BeginInvoke kann da helfen.
Task dann auch im Zusammenhang mit Asnyc Sub und Await.