CPU- und RAM-Auslastung eines System.Diagnostics.Process

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von chrismueller.

    CPU- und RAM-Auslastung eines System.Diagnostics.Process

    Ich habe einen System.Diagnostics.Process, sagen wir mit Dim Alf As New Process, dann die Alf.StartInfo gesetzt und mit Alf.Start() gestartet.

    Jetzt möchte ich in einem Timer in eine ProgressBar AlfCPU die CPU-Auslastung und in einer zweiten ProgressBar AlfRAM den verwendeten Arbeitsspeicher von Alf anzeigen.

    Wie kann ich das machen? Nach langem Googlen herausgefunden, es geht mit API-Funktionen, mit dem PerformanceCounter, mit Werten von Alf und noch auf dutzenden anderen Wegen.
    • Den PerformanceCounter mit seinen String-Werten zur Initialisierung kapiere ich nicht so ganz (Wie verwende ich den überhaupt oder z.B. auch nur mit einer PID ohne Prozessname, weil "java.exe" z.B. ja auch öfters offen sein kann)
    • Bei Alf.(Non)Paged(System)Memory, Alf.(Total/User)ProcessorTime usw. muss man scheinbar zwangsläufig etwas mit der Prozessorzeit oder verschiedene Arbeitsspeicherwerte ausrechnen,
      wobei ich auch hier nicht verstehe, wie Prozessorzeiten und Auslastung bzw. die verschiedenen Werte für RAM zusammenhängen.
    Gibt es eine einfachere Lösung?
    Ansonsten wäre es nett, wenn jemand mir das Prinzip des PerformanceCounter und/oder den Zusammenhang der Werte mal genauer erklären könnte.

    Vielen Dank im Voraus

    chrismueller

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

    Der PerformanceCounter ist der selbe, ob WinForms oder "Normal": drei String-Werte CategoryName, CounterName und InstanceName. Unter deinem Link (die Seite hatte ich allerdings auch schon per Google gefunden)gibt es jetzt aber nur die Möglichkeit, mit _Total die Gesamt-PC-Auslastung oder mit z.B. firefox die Prozessauslastung zu ermitteln. Jetzt laufen aber manchmal mehrere Java-Programme, also geht java schon mal nicht. Wie kann ich mit dem PerformanceCounter einen bestimmten Prozess (z.B. anhand der PID oder der Parameter) auswählen?
    Ich denke, mit dem PerformanceCounter kommst du da nicht allzu leicht ans Ziel.
    Ich würde WMI verwenden.
    Die Klasse: Win32_PerfFormattedData_PerfProc_Process
    enthält alles was du brauchst.

    Gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    vllt kannste damit ja was anfangen, wenn nicht dann ignoriers ;)

    VB.NET-Quellcode

    1. Dim ramCounter As New System.Diagnostics.PerformanceCounter("Memory", "Available MBytes")
    2. Dim lngSessMemory As Long
    3. sub ram()
    4. lngSessMemory = Process.GetCurrentProcess().WorkingSet64
    5. totalRam = CInt(objWMI.TotalPhysicalMemory / 1024 / 1024)
    6. usedRam = totalRam - ramCounter.NextValue
    7. programmUsedRam = CInt(lngSessMemory / 1024 / 1024)
    8. lblPerformanceRAM.Text = "RAM-useage (in MBytes): " & programmUsedRam & " / " & usedRam & " / " & totalRam
    9. end sub
    Jetzt lese ich mit der Methode "Warum einfach, wenns auch kompliziert geht?" die Prozessorauslastung so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim cpup As New Process
    2. cpup.StartInfo.FileName = "wmic"
    3. cpup.StartInfo.Arguments = "path win32_perfformatteddata_perfproc_process where (IDProcess = '" & Alf.Id & "') get PercentProcessorTime /format:list"
    4. cpup.StartInfo.RedirectStandardOutput = True
    5. cpup.StartInfo.UseShellExecute = False
    6. cpup.StartInfo.CreateNoWindow = True
    7. cpup.Start()
    8. cpup.WaitForExit()
    9. cpuout = cpup.StandardOutput.ReadToEnd()
    10. cpuout = cpuout.Split("=")(1)
    11. cpuout = System.Text.RegularExpressions.Regex.Replace(cpuout, "\s*", "")

    Das Ganze nach techish.net/windows/get-process-cpu-usage-using-wmi, was ich bei der Google-Suche nach Win32_PerfFormattedData_PerfProc_Process gefunden habe.
    Zu WMI in VB habe ich extrem wenig gefunden, deshalb einfach so.
    Frage: Ich bekomme immer höhere Werte als im Taskmanager angezeigt werden :( Warum und ist das ein Fehler oder mache ich was falsch?
    Und danke tolio, das mit dem Arbeitsspeicher funktioniert jetzt mit deiner Hilfestellung. Statt dem PerformanceCounter und WMI kann man für totalRam und usedRam auch My.Computer.Info verwenden. Interessant ist, dass man den Prozess erst noch mal neu einlesen muss, damit WorkingSet64 aktualisiert wird:

    VB.NET-Quellcode

    1. Dim AlfTmp = Process.GetProcessById(Alf.Id)