VB Schleife - Prozess prüfer

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    VB Schleife - Prozess prüfer

    Hallo,

    ich bin ziemlich neu in Visual Studio und hätte eine Frage an euch...
    Wie kann ich es anstellen, dass es den Prozess checkt und dabei in einer Schleife bleibt, dass, wenn der Prozess beendet ist, es den nächsten Code durchläuft...?



    Quellcode

    1. Dim a() As Process = Process.GetProcessesByName("123D Design")
    2. If a.Length > 0 Then
    3. Label1.Text = "123D Design running"
    4. SerialPort1.Open()
    5. SerialPort1.Write("5")
    6. SerialPort1.Close()
    7. End If
    8. End If
    Moin,

    schau Dir mal ​While an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Danke, aber wenn ich das tue:

    Quellcode

    1. ​ While a.Length > 0
    2. Dim a() As Process = Process.GetProcessesByName("123D Design") 'muss überprüft werden = Fehlermeldung, dass a nicht dekliniert wurde...
    3. Label1.Text = "123D Design running"
    4. SerialPort1.Open()
    5. SerialPort1.Write("5")
    6. SerialPort1.Close()
    7. End While
    Das geht natürlich nicht, da Du dann a schon benutzen willst, obwohl es nicht mal deklariert ist.
    Du suchst sowas:

    VB.NET-Quellcode

    1. Dim a As Process() = Process.GetProcessesByName("123D Design")
    2. While a.Length > 0
    3. Label1.Text = "123D Design running"
    4. SerialPort1.Open()
    5. SerialPort1.Write("5")
    6. SerialPort1.Close()
    7. a = Process.GetProcessesByName("123D Design")
    8. End While


    Wenn Du die Prozesse da intern nicht verwaltest, tut es auch eine Variable vom Typ Integer für die Länge.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hm, verstehe ich nicht ganz. Erstelle dazu evtl. einen neuen Thread, in dem Du das genau beschreibst. Ansonsten hilft auch einfach System.Threading.Thread.Sleep(100), aber das blockiert den Thread und das UI ist dann nicht bedienbar, bis die Zeit abläuft.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Das Problem ist, dass es die Schleife so schnell durchgeht, dass es hängen bleibt :/
    Wie kriege ich das sonst noch weg?
    Mit dem meinte ich sowas ähnliches wie :

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Timer1.Tick - der Timer "tickt" alle 1.5 Sekunden
    Achso. Das liegt nicht daran, dass es schnell ist, sonst wäre das ja besser, sondern dass es auf dem UI-Thread läuft und blockiert. Somit würde meine Idee den Effekt auch nur verstärken und ein Timer bringt auch nichts. Dazu brauchst Du einen neuen Thread (New Thread(AddressOf ...).Start(), ThreadPool.QueueUserWorkItem(...) oder gar Tasks mit async und await (TAP)).
    Einfach mal googlen, da findet sich viel. ^^

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Kannst Du schon, aber was bringt Dir das? Somit bleibt das UI dann im Endeffekt noch länger blockiert und Sinn hat das keinen.
    Wie gesagt, Multithreading ist die Lösung.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Mindstormsnxt schrieb:

    Delay einfügen?
    fang an und lass das Port offen.

    Trade schrieb:

    VB.NET-Quellcode

    1. SerialPort1.Open()
    2. SerialPort1.Write("5")
    3. SerialPort1.Close()
    Öffne das Port wenn der Prozess erkannt wurde und schließe es wenn der Prozess geschlossen wurde.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du hast doch alles, was Du wissen musst. Also kannst Du damit doch ein wenig suchen.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    OK, jetzt habe ich das:


    Quellcode

    1. Dim a As Process() = Process.GetProcessesByName("123D Design")
    2. If a.Length > 0 Then
    3. SerialPort1.Open()
    4. SerialPort1.Write("5")
    5. End If
    6. While a.Length > 0
    7. Label1.Text = "123D Design running"
    8. a = Process.GetProcessesByName("123D Design")
    9. End While
    10. SerialPort1.Close()


    Also öffnet es den Port, solange der Prozess aktiv ist, aber das Programm hängt sich auf...
    Gibt es etwas wie while, dass er wartet, bis sich etwas ändert und sich nicht aufhängt?

    Mindstormsnxt schrieb:

    aber das Programm hängt sich auf...

    Trade schrieb:

    Multithreading ist die Lösung
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Mindstormsnxt schrieb:

    "123D Design"
    Wenn Du diesen Prozess von Deinem Programm selbst aus startest, hast Du sehr viel weniger Ärger, er meldet sogar, wenn er beendet wird:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents p As Process
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. p = New Process
    5. p.StartInfo.FileName = "notepad.exe"
    6. p.EnableRaisingEvents = True
    7. p.Start()
    8. End Sub
    9. Private Sub Excited(sender As Object, e As EventArgs) Handles p.Exited
    10. MessageBox.Show("beendet")
    11. End Sub
    12. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Mindstormsnxt schrieb:

    wenn man es über das Programm startet?

    VB.NET-Quellcode

    1. p.WaitForInputIdle(500)
    Gugst Du hier.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!