Performence Counter - Werte

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

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

    Performence Counter - Werte

    Hallöle,

    Ich habe ein kleines Problem...
    Ich möchte, dass in einem Label die aktuelle CPU-Auslastung angezeigt wird. Dafür benutze ich folgenden 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";
    6. RAMCounter = new PerformanceCounter();
    7. RAMCounter.CategoryName = "Memory";
    8. RAMCounter.CounterName = "Available MBytes";
    9. cpuAuslastung = (int)cpuCounter.NextValue();


    Wenn ich jz allerdings die cpuAuslastung abfrage, dann unterscheiden sich die Werte von denen die im Taskmanager stehen...

    Kann mir jemand helfen? Oder weiß woran das liegt?

    LG Wolf
    Ich habe das ganze mal in vb.net nachgestellt, für mich ist das so einfacher.
    Nach ewigem rumprobiere hat das hier funktioniert:

    C#-Quellcode

    1. using Microsoft.VisualBasic;
    2. using System;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5. using System.Data;
    6. using System.Diagnostics;
    7. public class Form1
    8. {
    9. cpu = new System.Diagnostics.PerformanceCounter();
    10. private void Form1_Load(object sender, EventArgs e)
    11. {
    12. }
    13. private void Button1_Click(object sender, EventArgs e)
    14. {
    15. //Dim cpucounter As New PerformanceCounter
    16. //cpucounter.CategoryName = "Processor"
    17. //cpucounter.CounterName = "% Processor Time"
    18. //cpucounter.InstanceName = "_Total"
    19. dynamic RAMCounter = new PerformanceCounter();
    20. RAMCounter.CategoryName = "Memory";
    21. RAMCounter.CounterName = "Available MBytes";
    22. //Label1.Text = cpucounter.RawValue()
    23. Label2.Text = RAMCounter.RawValue;
    24. // TextBox1.Text = cpucounter.RawValue()
    25. cpu.CategoryName = "Processor";
    26. cpu.InstanceName = "_Total";
    27. cpu.CounterName = "% Processor Time";
    28. try {
    29. int a = int.Parse(Strings.Format(cpu.NextValue, "##0"));
    30. ProgressBar1.Value = a;
    31. Label1.Text = ProgressBar1.Value + " %";
    32. } catch (Exception ex) {
    33. ProgressBar1.Value = 0;
    34. Label1.Text = ex.Message;
    35. cputime.Interval = 3600000;
    36. }
    37. }
    38. public Form1()
    39. {
    40. Load += Form1_Load;
    41. }
    42. }


    Das wichtige ist eigentlich nur das hier:

    C#-Quellcode

    1. cpu = new System.Diagnostics.PerformanceCounter();
    2. cpu.CategoryName = "Processor";
    3. cpu.InstanceName = "_Total";
    4. cpu.CounterName = "% Processor Time";
    5. try {
    6. int a = int.Parse(Strings.Format(cpu.NextValue, "##0"));
    7. ProgressBar1.Value = a;
    8. Label1.Text = ProgressBar1.Value + " %";
    9. } catch (Exception ex) {
    10. ProgressBar1.Value = 0;
    11. Label1.Text = ex.Message;
    12. cputime.Interval = 3600000;
    13. }​


    Ich habe eine Progressbar und ein Label namens Label1.

    Ich hoffe ich konnte helfen!

    vb.net Quellcode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim cpu = New System.Diagnostics.PerformanceCounter
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. End Sub
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. 'Dim cpucounter As New PerformanceCounter
    7. 'cpucounter.CategoryName = "Processor"
    8. 'cpucounter.CounterName = "% Processor Time"
    9. 'cpucounter.InstanceName = "_Total"
    10. Dim RAMCounter = New PerformanceCounter()
    11. RAMCounter.CategoryName = "Memory"
    12. RAMCounter.CounterName = "Available MBytes"
    13. 'Label1.Text = cpucounter.RawValue()
    14. Label2.Text = RAMCounter.RawValue
    15. ' TextBox1.Text = cpucounter.RawValue()
    16. cpu.CategoryName = "Processor"
    17. cpu.InstanceName = "_Total"
    18. cpu.CounterName = "% Processor Time"
    19. Try
    20. Dim a As Integer = Integer.Parse(Format(cpu.NextValue, "##0"))
    21. ProgressBar1.Value = a
    22. Label1.Text = ProgressBar1.Value & " %"
    23. Catch ex As Exception
    24. ProgressBar1.Value = 0
    25. Label1.Text = ex.Message
    26. cputime.Interval = 3600000
    27. End Try
    28. End Sub
    29. End Class







    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



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

    Ist leicht zeitversetzt. Ich hatte vorher auch solche Zahlen, nach ein bisschen rumspielen ging es ordentlich. Sonst probiere mal den vb.net code aus mit den benötigten Elementen.
    @Bluespide
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    @Wolf066 Ich würde da die Werte über n Zyklen mitteln, da wird die Anzeige deutlich ruhiger.
    Wie oft sollen denn Deine Werte aktualisiert werden?
    Ernn jede Sekunde, mach eine Mittelung über 5 Werte im Takt von 200 Millisekunden.
    Wenn Du einen gleitenden Mittelwert programmierst, machst Du eine Queue(Of Integer), schiebst den neuen Wert rein, nimmst den ersten raus, wenn mehr als n Werte drin sind und berechnest den Mittelwert aus allen Werten in der Queue.
    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!
    @Wolf066 so was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private MyQueue As New Queue(Of Integer)
    3. Private Rnd As New Random
    4. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    5. Me.Timer1.Enabled = Not Me.Timer1.Enabled
    6. End Sub
    7. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    8. Dim value = Me.Rnd.Next(100) ' Dein nächster Wert
    9. ' sicherstellen, dass maximal 4 Werte in der Queue drin sind
    10. While Me.MyQueue.Count >= 4
    11. Me.MyQueue.Dequeue()
    12. End While
    13. ' den 5. Wert hinzufügen
    14. Me.MyQueue.Enqueue(value)
    15. ' und anzeigen / verwenden
    16. Me.Label1.Text = Me.MyQueue.Average.ToString("0")
    17. End Sub
    18. 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!