Form friert trotz Thread beim cmd Befehl gpupdate /force ein

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Bolle.

    Form friert trotz Thread beim cmd Befehl gpupdate /force ein

    Hallo,

    ich arbeite derzeit an einem Programm für die Automatisierung unterschiedlicher Geräte, die über eine TCPIP Verbindung kommunizieren.
    Das Programm läuft sehr gut, wenn die Firmen IT nicht im Hintergrund arbeitet. Insbesondere bei dem Befehl gpupdate /force friert die Hauptform ein.
    Ich konnte das Problem auch schon eingrenzen, verstehe allerdings nicht warum das passiert und hoffe deshalb auf eure Hilfe und Ideen

    Ich starte den Hauptablauf durch einen Button Klick

    VB.NET-Quellcode

    1. ThreadHauptablauf = New System.Threading.Thread(AddressOf Hauptablauf)
    2. ThreadHauptablauf.IsBackground = False
    3. ThreadHauptablauf.Start()


    Der Hauptablauf beinhaltet eine Do Schleife bis ein Abbruchkriterium gesetzt wird.
    In dem Hauptablauf werden verschiedene Stati der Maschinen abgefragt.
    Ich habe bis jetzt immer aus dem Hauptablauf über die Form der Maschine die Statusanfrage geschickt, welches auch sehr gut funktioniert, außer der Befehl gpupdate /force wird durch die IT oder über cmd ausgelöst.

    VB.NET-Quellcode

    1. Maschine1.TelegrammStatusmeldungSenden() 'Einfrieren der Form1 bei dem Befehl gpupdate /force


    VB.NET-Quellcode

    1. Public Class Maschine1
    2. Public Sub TelegrammStatusmeldungSenden()
    3. Dim Statusmeldung As String = "Status1"
    4. NachrichtAnClientSenden(Statusmeldung)
    5. End If
    6. End Sub
    7. End Class


    Wenn ich den Befehl über Invoke verschicke friert die Form nicht ein, allerdings habe ich natürlich auch Operationen, die etwas größer sind und längere Zeit meine Form bis zum Ende der Verarbeitung "pausieren" lassen.

    VB.NET-Quellcode

    1. Me.BeginInvoke(New BefehlFuerMaschine1(AddressOf BefehleAusThreadNachMaschine1), "Status") 'Funktioniert bei dem Befehl gpupdate /force



    Alternativ ist der Befehl der unschöne Befehl

    VB.NET-Quellcode

    1. Application.DoEvents()


    im Hauptablauf. So erwacht auch wieder meine Form bei

    VB.NET-Quellcode

    1. Maschine1.TelegrammStatusmeldungSenden() 'Einfrieren der Form1 bei dem Befehl gpupdate /force



    Habt ihr eine Idee warum das Programm dieses Verhalten zeigt?
    Kann mir vielleicht einer eine erste Hilfestellung an meinem Problem mit Async, Await und Task geben. ?(
    Aus diesem Beispiel hier bin ich nicht ganz schlau geworden.

    HTML-Quellcode

    1. https://www.vb-paradise.de/index.php/Thread/108880-Async-Await-und-Task/


    Beziehe ich das auf mein Problem, bedeutet das eine aufgelaufen Verzögerung durch gpudate /force in einem Thread, aufgerufen durch die Hauptform, wodurch andere Threads der Hauptform auch blockiert werden.
    Wenn ich den Thread Hauptablauf in eine andere Form packen würde, wäre meine Hauptform nicht blockiert?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bolle“ ()

    Ist eigentlich recht simpel zu verwenden:

    VB.NET-Quellcode

    1. Private Async Sub DoStuff()
    2. Await Task.Run(AddressOf DoAwesomeStuff)
    3. End Sub
    4. Private Sub DoAwesomeStuff()
    5. 'Do some awesome stuff...
    6. End Sub
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    OK Danke,

    habe mir jetzt ein kleines Beispiel dazu gebaut und das funktioniert auch ganz gut. Jetzt habe ich bewusst die Verarbeitung DoAwesomeStuff() auf 10 sek. gesetzt und der Hauptablauf geht "über" die Sub hinweg und setzt seine Verarbeitung fort. In DoAwesomeStuff() sammeln sich jetzt natürlich alte Verarbeitungen an, da der Hauptablauf schneller ist oder gibt es die Möglichkeit diese zu löschen?

    VB.NET-Quellcode

    1. Public Sub HauptablaufAsync()
    2. Do
    3. TextBox1.BeginInvoke(New TextboxAktual(AddressOf Textboxaktualisieren), "Label19", "Start")
    4. System.Threading.Thread.Sleep(1500)
    5. DoStuff()
    6. TextBox1.BeginInvoke(New TextboxAktual(AddressOf Textboxaktualisieren), "Label19", "Ende")
    7. System.Threading.Thread.Sleep(1500)
    8. Loop
    9. End Sub
    10. Private Async Sub DoStuff()
    11. Await Task.Run(AddressOf DoAwesomeStuff)
    12. 'Der Task läuft noch nach, auch wenn der Hauptthread schon beendet ist
    13. 'Dim t As Task = New Task(Sub() DoAwesomeStuff1(Durchlauf))
    14. 't.Start()
    15. End Sub
    16. Private Sub DoAwesomeStuff()
    17. 'Do some awesome stuff...
    18. TextBox1.BeginInvoke(New TextboxAktual(AddressOf Textboxaktualisieren), "Label20", "1")
    19. System.Threading.Thread.Sleep(10000)
    20. TextBox1.BeginInvoke(New TextboxAktual(AddressOf Textboxaktualisieren), "Label20", "FERTIG")
    21. System.Threading.Thread.Sleep(1000)
    22. End Sub


    Beziehe ich das auf mein Problem hilft also:
    ???

    VB.NET-Quellcode

    1. Dim t As Task = New Task(Sub() Maschine1.TelegrammStatusmeldungSenden())
    2. t.Start()

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Bolle“ ()

    Ich habe jetzt die Sub

    VB.NET-Quellcode

    1. Maschine1.TelegrammStatusmeldungSenden()


    durch

    VB.NET-Quellcode

    1. Dim t As Task = New Task(Sub() Maschine1.TelegrammStatusmeldungSenden())
    2. t.Start()


    erstzt, leider ohne Erfolg. Der Hauptablauf läuft bei dem Befehl gpupdate /force im Debugger weiter und die Form ist eingefroren.
    Der Benutzer hat somit keine Chance Eingaben zu tätigen oder angezeigt zu bekommen.


    dein hauptAblauf-Dingens ergibt mir gar keinen Sinn, daher kann ich dich auch schlecht beraten, ausser zu fragen, was denn nu passieren soll?


    Der Hauptablauf beinhaltet eine Do Schleife bis ein Abbruchkriterium gesetzt wird.
    In dem Hauptablauf werden verschiedene Stati der Maschinen abgefragt und dieser befinden sich in einem Thread.
    Klappt sehr gut bis gpupdate /force.
    also dass der HauptAblauf-Thread einfriert liegt an den Zeilen #4 und #7:

    VB.NET-Quellcode

    1. System.Threading.Thread.Sleep(1500)
    So eine Zeile blockiert den Thread für 1500ms.
    Vielleicht möchtest du da stehen haben:

    VB.NET-Quellcode

    1. Await Task.Delay(1500)

    Nee - das isses auch nicht.
    Ich glaub, dein HauptAblauf ist garnet in einem NebenThread. Das würde jdfs. das unerwartete Verhalten erklären.
    Sorry

    VB.NET-Quellcode

    1. Public Sub HauptablaufAsync()


    ist natürlich in einem Thread, daher friert auch nichts ein.

    Kann es vielleicht sein, dass die my.settings zu einem einfrieren bei dem Befehl gp.. führen? Ich benutze diese ab und an in einem Thread.
    Kann ich irgendwie feststellen, ob ich meine Form mit

    VB.NET-Quellcode

    1. TextBox1.BeginInvoke(New TextboxAktual(AddressOf Textboxaktualisieren), "Label20", "1")


    überfordere, also zu viele Zugriffe aus Threads?




    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Bolle“ ()

    Bolle schrieb:

    ist natürlich in einem Thread, daher friert auch nichts ein.
    prüf das nach.
    mach in deim MainForm eine Ausgabe von System.Threading.Thread.Current.ManagedThreadId, und mach in HauptablaufAsync() dieselbe Ausgabe.
    Vorher täte ich das nicht glauben. (Doch, schon, allein das Verhalten legt ja anderes nahe)
    Das gilt doch nur für Tasks oder? Ich starte die do Schleife im Hauptablauf über

    VB.NET-Quellcode

    1. ThreadHauptablauf = New System.Threading.Thread(AddressOf Hauptablauf)
    2. ThreadHauptablauf.IsBackground = False
    3. ThreadHauptablauf.Start()


    und in der Do Schleife vom Hauptablauf befinden sich dann weitere Threads

    VB.NET-Quellcode

    1. ThreadStatus = New System.Threading.Thread(AddressOf Staus)
    2. ThreadStatus.IsBackground = True
    3. ThreadStatus.Start()


    Wie bereits erwähnt funktioniert das Programm sehr gut bis gpup... erfolgt.
    Hmm - ich dachte, ich hätte mich ganz klar ausgedrückt:

    ErfinderDesRades schrieb:

    mach in deim MainForm eine Ausgabe von System.Threading.Thread.Current.ManagedThreadId, und mach in HauptablaufAsync() dieselbe Ausgabe.
    Wenn die Zahlen verschieden sind, ist damit bewiesen, dass die Methode wie gewünscht in einem vom MainThread verschiedenem Thread läuft.

    Das gilt für Threads. Und ob die mittels Task, Async, BeginInvoke oder New Thread() auf den Weg gebracht sind, ist dabei pipe.

    Das mit dem gpup... versteh ich nicht, was ist das?
    gpudate /force ist ein Befehl zur Aktualisierung der Gruppenrichtlinien und wird über die Windows Konsole (cmd) eingegeben oder über die Firmen IT erzwungen.
    Was genau der Befehl im Detail macht weiß ich nicht , jedenfalls friert die Form immer ein und die gestarteten Threads laufen im Hintergrund weiter.

    Gestern konnte ich weiter testen und ganz beseitigen.
    Ich benutze in dem Hauptablauf Thread Verweise auf Subs in anderen Formen Bsp.: Form2.Status() oder auch auf Module.
    Füge ich nun der Hauptform, in der auch der Hauptthread gestartet wurde

    VB.NET-Quellcode

    1. Dim Form2 As New Form2

    hinzu und weitere Formen, auf die ich in dem Thread zugreife, friert die Oberfläche bei dem Befehl gpupdate /force nicht mehr ein.