Ram Auslastung eines Prozesses auslesen

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

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

    Ram Auslastung eines Prozesses auslesen

    Moin! :)
    Ich möchte über einen fremden Prozess Informationen abfragen.
    Zum Beispiel über den „firefox.exe“, wieviel RAM dieser gerade benötigt.
    Leider finde ich keine Lösung!
    Ich habe schon stundenlang gegoogelt und verschiedene mögliche Wege ausprobiert.
    Je nach Code, kommen immer andere Ergebnisse raus.
    Code im Anhang!

    Ich möchte den genauen Wert von einen beliebigen Prozess in diesem Fall vom firefox.exe richtig angezeigt bekommen, so wie dieser auch im Task Manager drin steht. :!:

    Wäre Super, wenn jemand mir dabei helfen kann.
    Da ich mit meinen Latein am Ende bin.
    BIG THX


    Code:
    gelöscht...

    Visual Basic.NET 8o
    MS-SQL
    8o

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

    @BlueLagoonX Es kommen überall andere Zahlen raus, keine von denen stimmt mit dem Wert im Taskmanager überein.
    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!
    Jetzt nur als grober Code,
    ich komme damit ziemlich genau auf die Zahlen im Taskmanager:

    VB.NET-Quellcode

    1. For Each Prozess As Process In Process.GetProcesses()
    2. If (Prozess.ProcessName = "Notepad") Then ' Ohne die Zeile kannst du alle Prozesse ausgeben und auslesen lassen
    3. Dim pf1 As PerformanceCounter = New PerformanceCounter("Process", "Working Set - Private", Prozess.ProcessName)
    4. Debug.WriteLine("{0}:{1} {2:N}MB", Prozess.ProcessName, "Private Working Set ", pf1.NextValue() / 1024 / 1024)
    5. End If
    6. Next




    Ausgabe:

    ​Notepad:Private Working Set 1.99MB



    Meine Website:
    www.renebischof.de

    Meine erste App (Android):
    PartyPalooza
    @an alle
    Danke, für eure Antwort.
    Das Problem war, dass mir irgendwelche komischen Zahlen erschienen sind.
    Die nicht mit dem Taskmananger vergleichbar sind.

    @xored
    Danke, für deine Antwort.
    Der Code von dir, war der beste den ich finden könnte.
    Dieser ist fast mit dem Taskmanager gleich.
    Danke


    edit2:
    Schade, ich habe mich zu früh gefreut.
    Der Code läuft leider nicht unter Windows XP.
    Mein Programm muss auf XP laufen.

    Kennt jemand eine Lösung ohne den PerformanceCounter? ?(


    VB.NET-Quellcode

    1. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    2. Dim zahl_MB As Long = 0
    3. For Each p As Process In Process.GetProcessesByName("Notepad")
    4. zahl_MB += p.WorkingSet64
    5. Next
    6. Me.Text = zahl_MB / (1024 * 1024) ' !???
    7. End Sub
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    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!
    @BlueLagoonX
    Danke, für deine Antwort. :)
    Es muss XP sein, weil das Programm auf diesem System ausgeführt werden muss.
    Ob WorkingSet64 oder WorkingSet leider immer noch der gleiche Fehler.

    @RodFromGermany
    Danke, für deine Antwort. :)

    @an alle
    Leider habe ich bis heute noch keine Lösung gefunden. ;(
    Es muss doch möglichsein, diesen Code auf XP auszuführen.
    Früher gab es ja auch kein neueres Windows.

    VB.NET-Quellcode

    1. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    2. Dim zahl_MB As Long
    3. Dim Scope As New ManagementScope("\\.\ROOT\cimv2")
    4. Dim Query As New ObjectQuery("SELECT * FROM Win32_PerfRawData_PerfProc_Process Where Name=" & "'notepad'")
    5. Dim Searcher As New ManagementObjectSearcher(Scope, Query)
    6. Dim queryCollection As ManagementObjectCollection = Searcher.Get
    7. For Each mObject As ManagementObject In queryCollection
    8. zahl_MB += (mObject("WorkingSetPrivate") / 1024 / 1000)
    9. Next
    10. MessageBox.Show(zahl_MB & "MB")
    11. End Sub



    Der Fehler erscheint weil Windows XP diesen Code (mObject("WorkingSetPrivate") nicht ausführen kann! ?(
    Auf neuere Windowssystemen läuft der Code perfekt!
    Visual Basic.NET 8o
    MS-SQL
    8o
    @Cheffboss Kopiere mal die PDB-Datei neben die Exe, da bekommst Du eine bessere Fehlermeldung.
    Welches Framework verwendest Du?
    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!

    Cheffboss schrieb:

    Es muss doch möglichsein, diesen Code auf XP auszuführen.
    Früher gab es ja auch kein neueres Windows.


    Wieso muss es? Microsoft sagt hier: docs.microsoft.com/de-de/windo…y-performance-information
    Das WorkingSetPrivate nicht unterstützt wird.
    Damit ist der Hase gelaufen und fertig. Nicht alles was du siehst in Windows kannst du per Framework eben abrufen.
    Schmeiß XP aus der "läuft" Liste raus und schon hast du solche Probleme nicht mehr. Vor allem das System schon sau lange schon einfach end of life ist.

    Außerdem fang bitte mal mit Option Strict On an.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Hi

    Nur ein Vorschlag. Es gibt ja neben der PerformanceCounter-Klasse in .NET ja auch noch die ganz normalen PerformanceCounter-APIs (Pdh.dll) und die sollten ab WinXP aufrufbar sein und soweit ich mich erinnere kann, konnte man auch alle verfügbaren Counter und die dazu gehörenden Parameter in einem Dialog anzeigen lassen. Vllt nennt sich der Counter oder Parameter unter XP einfach nur anders oder es gab diesen noch garnicht. Da dürfte auch ein ObjectQuery usw. nicht funktionieren wenn es den Counter oder den Parameter noch nicht gab.

    Ansonsten: Ich geb den anderen recht wenn sie sagen, werf XP aus dem Programm wo deine Software noch laufen soll. Ist ja auch schon lange Out of order.

    Edit: Da ich gerade keine Lust hab das nach .NET zu übersetzten, hier ein VB6 Code wie Du den Dialog mit allen Countern und Parametern aufrufen kannst.

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Const PERF_DETAIL_WIZARD As Long = 400
    3. Private Declare Function PdhVbCreateCounterPathList Lib "pdh.dll" ( _
    4. ByVal DetailLevel As Long, _
    5. ByVal CaptionString As String) As Long
    6. Private Sub Command1_Click()
    7. Call PdhVbCreateCounterPathList(PERF_DETAIL_WIZARD, ":-)")
    8. End Sub

    Zu beachten wäre, das auf einem deutschen System natürlich die Counter und Parameter auf deutsch angezeigt werden. Damit das aber auf allen Windowssystemen, egal welche Sprache, funktioniert, verwendet man die englischen Bezeichnungen. Irgendwo gibt es auch eine Mappingtabelle (Internet, Registry) um auf die englischen Namen zu kommen. Alternativ stellst ein Testsystem auf englisch um damit im Dialog die englischen Bezeichnungen zu sehen sind. Dann kannst ja mal schauen ob man unter XP entsprechendes auslesen kann.
    Mfg -Franky-

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „-Franky-“ ()

    @RodFromGermany
    Wenn ich die PDB-Datei Datei mit dem Editor öffne, sehe ich nur komische Buchstaben.
    Wie kann man daraus eine Fehlermeldung auslesen?
    Bist jetzt habe ich die PDB-Dateien einfach ignoriert, da ich den Sinn noch nicht kenne.
    Ich dachte irgendwas mit Debuging…
    Mein Projekt verwendet noch das alte NET Framework 2.00, weil es so erwünscht ist.

    @xChRoNiKx
    Danke, für die Nachricht, dass WorkingSetPrivate nicht mehr unter XP unterstützt wird.
    Deshalb versuche ich noch einen anderen Weg zu gehen...

    @-Franky-
    Danke, für deinen Vorschlag.
    Ich versuche nun mit dem PerformanceCounter-APIs (Pdh.dll) zu arbeiten.
    Meine Google suche hat mich auf eine interessante Webseite gelenkt.
    Eine PerformanceCounter Software die ab Windows 2000 SP4 ausführbar ist.
    Ohne das System.Diagnostics.PerformanceCounter.

    @an alle
    Prozess --> Private Bytes --> notepad
    Ich habe ein Screenshort hinzugefügt!
    Denn leider, weiß ich derzeit noch nicht, wie ich diesen Wert in meinem Programm auslesen kann.
    Aktuell: 909312 Bytes – Notepad.exe
    Kennt jemand die Lösung, wie ich an diesen Wert rankomme?
    In meinem Visual Basic.NET Projekt.
    BIG THX :?:


    Link:
    mikebeh.de/perfcount.htm
    Visual Basic.NET 8o
    MS-SQL
    8o

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

    Cheffboss schrieb:

    Wenn ich die PDB-Datei Datei mit dem Editor öffne, sehe ich nur komische Buchstaben.
    Wie kann man daraus eine Fehlermeldung auslesen?
    Das übernimmt das System für Dich.
    Mit der Exception holt das Framework die entsprechende Code-Info aus der Datei und zeigt sie an.
    Mit der Klasse / Prozedur / Code-Zeile weißt Du dann, wo die Exception aufghetreten 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!
    @Cheffboss

    Code von xored nehmen und anstatt "Working Set - Private" eben "Private Bytes" einsetzen. In dem ScreenShot siehst Du doch Links die Counter und in der Mitte den Parameter. Das was da im ScreenShot zu sehen ist, ist fast das gleiche was Du mit der API PdhVbCreateCounterPathList anzeigen lassen kannst. Wie geschrieben: deutsche Anzeige, englische Bezeichnungen verwenden.
    Mfg -Franky-
    @an alle
    Ich danke euch alle für eure Antwort. :)
    Ich habe nun leider festgestellt dass es nur eine Lösung mit psapi.DLL gibt.
    Weil die .NET Framework Funktionen und der WMI-Code liefern immer falsche Ergebnisse.

    Um die Übersicht im Forum zu bewahren, weil hier nun bereits viel geschrieben steht.
    Eröffne ich einen neuen Beitrag.
    Zu diesem neuen Thema!
    Visual Basic.NET 8o
    MS-SQL
    8o