PC - CPU-Auslastung ohne Performence Counter

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Wolf066.

    PC - CPU-Auslastung ohne Performence Counter

    Hallo,
    Ich bins mal wieder...

    Ich würde in meinem kleine Tool keine die CPU-Auslastung des gesamten PC Anzeigen, also das was auch im Taskmanager zu sehen ist...

    Aktuell hab ich das mit einem Performencecounter versucht... Diese Werte sind allerdings nicht korrekt...

    Weiß evtl. jemand noch eine andere Möglichkeit wie man das lösen könnte, also das die richtigen Werte angezeigt werden?

    LG und danke schon mal :D

    Freddy

    Aktueler Code:

    C#-Quellcode

    1. static PerformanceCounter cpuCounter; // globaler PerformanceCounter
    2. cpuCounter = new PerformanceCounter();
    3. cpuCounter.CategoryName = "Processor";
    4. cpuCounter.CounterName = "% Processor Time";
    5. cpuCounter.InstanceName = "_Total";
    Hallo,

    da bin ich auch noch am Suchen. Alle Beispielcodes aus dem Netz zeigen am Ende andere Werte als der Taskmanager oder unter Windows 7 auch die Minianwendung CPU/RAM. Meine Theorie ist, da man als normaler User die System-Tasks im Taskmanager nicht sieht, diese dann auch nicht beim Performance-Counter addiert werden. - Allerdings laufen die Minianwendungen nicht mit Admin-Rechte - Darüber hinaus ist laut einigen Seiten auch die Pause zwischen den Abfragen von Bedeutung.

    Spekulation:
    Hinzu kommt, Windows legt die Prozessorkerne mehrmals die Sekunde schlafen, lässt Tasks von Kern zu Kern hüpfen. Bei der Abfrage wird dann wohl nur der tatsächliche Ist-Zustand berücksichtigt. Der ändert sich aber dauernd.


    MS sollte da Mal eine einfache API für schaffen. CPU-Kerne zählen und Performance-Counter (den Prozessorbedarf jedes einzelnen Tasks ermitteln) klingt für mich nicht nach Hochsprache.

    Vielleicht sollte ich mal den alten Win-7 Rechner reaktivieren und per Sysinternal-Tool schauen, was die Minianwendung da so aufruft.
    Gruß
    Peterfido

    Keine Unterstützung per PN!
    Versuchts mal hiermit. War das beste was ich bisher gefunden hab:

    C#-Quellcode

    1. private sealed class Performance
    2. {
    3. private static TimeSpan OLD;
    4. private static TimeSpan NEW;
    5. private static Stopwatch TrackTime;
    6. public static void Init()
    7. {
    8. OLD = Process.GetCurrentProcess().TotalProcessorTime;
    9. TrackTime = new Stopwatch();
    10. TrackTime.Start();
    11. }
    12. public static double GetCPU()
    13. {
    14. NEW = Process.GetCurrentProcess().TotalProcessorTime;
    15. TrackTime.Stop();
    16. TimeSpan delta = NEW - OLD;
    17. var res = delta.TotalMilliseconds / TrackTime.ElapsedMilliseconds;
    18. OLD = NEW;
    19. TrackTime.Restart();
    20. return res / Environment.ProcessorCount * 100;
    21. }
    22. public static long GetRAM()
    23. {
    24. return Process.GetCurrentProcess().WorkingSet64; //closest to Task-Manager
    25. }
    26. public static void Stop()
    27. {
    28. TrackTime.Stop();
    29. }
    30. }

    Diese Klasse berechnet dir die CPU-Auslastung deines Prozesses zwischen zwei Aufrufen von GetCPU() bzw. zwischen Init() und GetCPU().

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

    Ich versteh nicht ganz wie ich diese Klasse verwenden soll?

    Weil so gehts ja ned xD

    C#-Quellcode

    1. ​ Performance.Init();
    2. label1.Text = Performance.GetCPU().ToString();


    Aber die ganzen methoden sind ja Static.... Die hängen doch zusammen oder?

    Wie muss ich das denn genau implementieren xD
    irgendwo in der Main machste einmal das Init() und dann per Timer oder sonst was rufst du immer wieder GetCPU auf. Das Ergebnis ist dann der prozentuale Zeitverbrauch deines Prozesses an der gesamten CPU-Zeit zwischen zwei aufrufen von GetCPU() oder Init() und GetCPU()

    Ich merke nur gerade, dass das etwas an deinem Ziel vorbei geht, da sich diese Mthode nur auf den aktuellen Prozess beschränkt, und nicht alle Anwendungen abbildet.