pat.bat
Goto Top

Visual Basic - Select Case - Update Status Bar

Hallo zusammen,

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

Content-Key: 480870

Url: https://administrator.de/contentid/480870

Printed on: April 20, 2024 at 04:04 o'clock

Member: emeriks
Solution emeriks Aug 02, 2019 at 11:55:47 (UTC)
Goto Top
Hi,
pack mal in die Sub UpdateStatusBar ein "Application.DoEvents" nach der Änderung rein.

E.
Member: Pat.bat
Pat.bat Aug 02, 2019 updated at 12:27:07 (UTC)
Goto Top
Hat Funktioniert, danke.

Frage nebenbei, warum musste in diesem Fall das Application.DoEvents dazu?

hier nochmal die Sub:

Private Sub UpdateStatusBar(ByVal Status As String, ByVal Message As String)
        If (Status = "Fehler") Then  
            Me.ToolStripStatusLabel1.Text = Message
            Me.ToolStripSplitButton1.Image = My.Resources.Fehler
        ElseIf (Status = "Warnung") Then  
            Me.ToolStripStatusLabel1.Text = Message
            Me.ToolStripSplitButton1.Image = My.Resources.Warnung
        ElseIf (Status = "OK") Then  
            Me.ToolStripStatusLabel1.Text = Message
            Me.ToolStripSplitButton1.Image = My.Resources.OK
            Timer1.Interval = 5000
            AddHandler Timer1.Tick, AddressOf Timer_Tick
            Timer1.Start()
        End If
        Application.DoEvents()
    End Sub
Member: Kraemer
Kraemer Aug 02, 2019 at 12:42:19 (UTC)
Goto Top
Zitat von @Pat.bat:

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 ...
Member: emeriks
emeriks Aug 02, 2019 updated at 13:45:38 (UTC)
Goto Top
Zitat von @Pat.bat:
Frage nebenbei, warum musste in diesem Fall das Application.DoEvents dazu?
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.
Mitglied: 140447
140447 Aug 02, 2019 updated at 15:44:55 (UTC)
Goto Top
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.
Member: Pat.bat
Pat.bat Aug 23, 2019 updated at 06:46:09 (UTC)
Goto Top
@emeriks
@140447

Moin zusammen,

ich muss hier nochmal nachfragen: Wie genau lagere ich Prozesse in seperate Threads aus? Ich habe versucht das ganze zu googlen, aber ohne Erfolgt. Wahrscheinlich suche ich aber auch nur falsch.

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.

Allerdings habe ich damit bis jetzt noch keine Erfahrung.

Kennt ihr zufällig ein passendes Tutorial oder Website zu dem Thema?


Vielen Dank im Voraus
Member: Kraemer
Kraemer Aug 23, 2019 at 07:25:50 (UTC)
Goto Top
Ich bin mir nicht sicher, ob du die Funktionsweise von Threads verstanden hast, aber hier mal ein simples Beispiel:

https://youtu.be/KK5D4Y2fnl4
Member: emeriks
emeriks Aug 23, 2019 updated at 15:06:26 (UTC)
Goto Top
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.

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.