Problem ohne Wait lösen! Items auslesen!

  • VB.NET
  • .NET (FX) 1.0–2.0

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

    Problem ohne Wait lösen! Items auslesen!

    Moin! :)
    Ich versuche bereits mehrere Tage eine Lösung zu finden.
    Deshalb brauche ich eure Hilfe.
    Im Projekt habe ich nochmals alles genau erklärt.
    Also.
    Ich möchte dass man auf einen Button klickt und dann zuerst alle Prozesse aufgelistet werden und danach soll sich das neue Fenster öffnen.

    Nun zum Problem.

    Das Programm ist schneller als der Code.
    Wenn ich nun auf den Button klicke, wird das neue Fenster bereist ohne die Prozesse angezeigt.

    Meine Lösung:

    Ich habe es nun so gelöst das, dass Programm 3000ms wartet.
    Aber ich könnte feststellen, wenn jemand eine langsamere CPU hat, reicht oft das Warten nicht, da man z.B dann 4000ms oder länger warten muss…
    Deshalb suche ich eine bessere Lösung.

    Freue mich auf eure Hilfe.
    Mein Wunsch wäre, das Problem spätestens Ende dieser Woche gelöst zu bekommen.
    BIG THX

    VB.NET-Quellcode

    1. Private Sub btnProzesseAnzeigen_Click(sender As Object, e As EventArgs) Handles btnProzesseAnzeigen.Click
    2. LeseAlleProzesseAus()
    3. ' Hier alle Prozesse zuerst auslesen und dann weiter machen...
    4. WaitOnGUI(3000)
    5. Dim neuesfenster As New frmFensterFrage(True, Me.lvAnwendungenListe.Items)
    6. neuesfenster.ShowDialog()
    7. End Sub
    8. Public Sub WaitOnGUI(ByVal ms As Integer)
    9. Dim timeOut As Date = Date.Now().AddMilliseconds(ms)
    10. While timeOut > Date.Now
    11. Application.DoEvents()
    12. End While
    13. End Sub




    Downloadlink:
    alter code gelöscht...
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Cheffboss schrieb:

    Das Programm ist schneller als der Code.

    Echt lustig. :thumbsup:

    Warte doch einfach bis LeseAleProzesseAus fertig ist und mach dann erst weiter, oder lass die Func einen Event feuern und reagiere darauf.

    Cheffboss schrieb:

    Das Programm ist schneller als der Code.
    Disable den Button initial und gib ihn erst frei, wenn alles andere fertig ist.
    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!
    @an alle
    Vielen Dank, ich habe nun vielleicht eine Lösung gefunden. :thumbup:
    Ich werde diese morgen nochmals gründlich prüfen.
    Wie findet Ihr meine Lösung?
    Bin ich auf dem richtigen Weg?

    Hier mein Code:
    alter code entfernt...
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Ist jetzt nicht so dolle.
    Das ist ne doppelte Do-Schleife und die Function gibt niemals was anderes als True zurück. Das kannste dann auch gleich lassen und ne Sub draus machen. Dann kannste die Do-Schleife in btnProzesseAnzeigen_Click auch weglassen. Und das Auswerten von Control-Daten ist häufig ein Code-Smell, so m.E. auch hier. Arbeite mit Daten, nicht mit Controlinhalten. Und das mit den DoEvents … Dann lieber sauber mit Async/Await
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Danke, habe den Code nun verbessert.
    :thumbsup:

    VB.NET-Quellcode

    1. Private Sub WarteAufProzessDaten()
    2. Do
    3. If Me.lvAnwendungenListe.Items.Count <> 0 Then Exit Sub
    4. If proc.HasExited Then Exit Sub
    5. Application.DoEvents()
    6. Loop
    7. End Sub
    8. Private Sub btnProzesseAnzeigen_Click(sender As Object, e As EventArgs) Handles btnProzesseAnzeigen.Click
    9. LeseAlleProzesseAus()
    10. WarteAufProzessDaten()
    11. Dim neuesfenster As New frmFensterFrage(True, Me.lvAnwendungenListe.Items)
    12. neuesfenster.ShowDialog()
    13. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o
    @VaporiZed Jou.
    @Cheffboss Das ganze ist letzt endes ein Warten auf ein proc.HasExited.
    Das kannst Du eleganter haben:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents prc As Process
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. prc = New Process
    5. prc.StartInfo.FileName = "notepad.exe"
    6. prc.EnableRaisingEvents = True
    7. prc.Start()
    8. End Sub
    9. Private Sub prc_exit(sender As Object, e As EventArgs) Handles prc.Exited
    10. MessageBox.Show("Prozess 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!
    @an alle
    Ich habe das Problem nun lösen können.
    Die Lösung ist im vorletzen Post von mir zusehen. ;)

    @RodFromGermany
    Ja. Aber ich denke ich ändere den Code noch.
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Cheffboss schrieb:

    Die Lösung ist im vorletzen Post von mir zusehen.
    Ohne EnableRaisingEvents, mit Warteschleife und DoEvents()?

    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!

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