Hohe CPU-Belastung bei Prozessabfrage

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Rinecamo.

    Hohe CPU-Belastung bei Prozessabfrage

    Huhu Community,
    ich habe folgenden Code:

    Code um zu prüfen, ob ein beliebiger Prozess läuft:

    VB.NET-Quellcode

    1. Private Function checkprocess(ByVal name As String) As Boolean
    2. For Each Process In System.Diagnostics.Process.GetProcessesByName(name)
    3. Return True
    4. Next
    5. Return False
    6. End Function


    Letztendlich die dauerhafte Abfrage in dem Falle für H1Z1:

    VB.NET-Quellcode

    1. Do
    2. If (checkprocess("h1z1")) Then
    3. 'Mache iwas'
    4. End If
    5. Loop


    Bei diesen beiden Codes hat das Programm eine CPU-Auslastung von ca 30 Prozent hervorgerufen!
    Ich besitze einen i5-6600K. Gibt es CPU-schonendere Methoden um kontinuierlich abzufragen ob ein Prozess aktiv ist?

    EDIT:// Ich habe das Problem derzeit mit einem Sleep Befehl behoben. Dadurch lassen sich sehr niedrige Prozentwerte erreichen. Dennoch würde es mich interessieren, ob es zu diesem Problem elegantere Lösungen gibt :)

    Liebe Grüße :)

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

    Brauwn schrieb:

    Ich habe das Problem derzeit mit einem Sleep Befehl behoben.
    Vielleicht nimmst Du einen Timer mit einem Intervall von 1000 Millisekunden, das sollte genügen.
    Überleg noch mal genau, was Deine Schleife in checkprocess eigentlich tut.
    Setz da einfach einen Haltepunkt rein und steppe sie durch.
    Aißerdem klickst Du auf GetProcessesByName und drückst auf F1.
    ===
    Wie also sieht Deine neue Prozedur checkprocess aus?
    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!

    RodFromGermany schrieb:

    Überleg noch mal genau, was Deine Schleife in checkprocess eigentlich tut.


    @RodFromGermany Ich hoffe, ich mache keine Lernprozesswünsche zunichte.:

    VB.NET-Quellcode

    1. For Each Process In System.Diagnostics.Process.GetProcessesByName(name)
    2. Return True
    3. Next
    4. Return False

    ließe sich wohl vereinfachen zu

    VB.NET-Quellcode

    1. Return System.Diagnostics.Process.GetProcessesByName(Name).GetUpperBound(0) > -1

    Aber davon abgesehen - wir wissen ja nicht, wie das komplette Codebild aussieht - stellt sich natürlich auch die Frage, wie oft so eine läuft-ein-bestimmter-Prozess-Abfrage aufgerufen werden muss.
    @Brauwn Wenn es Dir darum geht, einen bestimmten Prozess z.B. zu beenden und dann zu schauen, ob der Prozess beendet wurde, ist der Vorschlag von RodFromGermany eine gute Möglichkeit. Irgendeine kleine Pause zwischen den Prozess-läuft-noch-Abfragen wäre schon sinnvoll. Man will ja dem Computer auch die Chance lassen, sich um den gesuchten Prozess und dessen Veränderungen zu kümmern ;)
    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 oder so:

    VB.NET-Quellcode

    1. Return System.Diagnostics.Process.GetProcessesByName(name).Length > 0
    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!
    Für so was kannst du den ManagementEventWatcher verwenden.
    Das dort angebrachte Beispiel reagiert auf alle startenden Prozesse. Wenn du diese Abfrage ​"SELECT * FROM Win32_ProcessStartTrace" aus dem Code noch anpasst, kannst du auch beispielsweise nur auf den Prozess mit dem Namen "h1z1" warten.