CPu -Auslesen

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

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Facebamm.

    CPu -Auslesen

    Hallo zusammen,

    ich bin gerade dabei per C# meine CPU auszulesen und hab da paar kleine Fragen.
    1. Sind Admin rechte zwingend Nötig beim PerformanceCounter?
    2.
    Hab Folgenden Code ausprobiert den ich auch hier im Forum gefunden hab und mich dahin geführt hat [Page]
    Und sind dort auch Admin rechte von nöten?
    Spoiler anzeigen

    C#-Quellcode

    1. ​private string GetCPUUses() {
    2. ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor");
    3. var cpuTimes = searcher.Get().OfType<ManagementObject>().Where(item => item["Name"].ToString() == "_Total").Select(item => item["PercentProcessorTime"]);
    4. var cpuUsage = cpuTimes.SingleOrDefault();
    5. return cpuUsage.ToString();
    6. }

    3. [1. & 2.] = True => Könnte man es auch über die WinAPI via Kernel32 lösen, wenn ja, hat jemand für mich einen kleine Denk anstoß wie ich das evtl lösen könnte?

    Facebamm schrieb:

    aber es geht irgendwie nicht -.-
    Werde ich mal als Fehlermeldung des Jahres vorschlagen.
    Vielleicht gehts doch erwas präziser?
    Teste es mit Admin-Rechten und berichte.
    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!
    da ist schon mal zu 1. mit und ohne Admin
    System.InvalidOperationException:

    C#-Quellcode

    1. public string GetCpuUsage() {
    2. var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    3. return ((int)cpuCounter.NextValue()).ToString();
    4. }


    zu 2.
    hier findet er nix

    C#-Quellcode

    1. ​private string GetCPUUses() {
    2. ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor");
    3. var cpuTimes = searcher.Get().OfType<ManagementObject>().Where(item => item["Name"].ToString() == "_Total").Select(item => item["PercentProcessorTime"]);
    4. var cpuUsage = cpuTimes.SingleOrDefault();
    5. return cpuUsage.ToString();
    6. }

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

    Facebamm schrieb:

    System.InvalidOperationException
    in welcher Zeile?
    Ich rate mal: Zeile 2. Das hat nix mit Admin-Rechten zu tun.
    Stimmt der String, den Du da übergibst, mit dem String, der erwartet wird, überein? Ich glaube mal nicht.
    Wo hast Du den her?
    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!
    @Facebamm Folgendes funktioniert bei mir, allerdings weiß ich nicht, was die Werte darstellen:

    VB.NET-Quellcode

    1. Me.TestCounter = New PerformanceCounter("Processor", "% Processor Time", "_Total")

    VB.NET-Quellcode

    1. Dim test = Me.TestCounter.NextValue()
    2. Me.lblText.Text = test.ToString()

    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!
    Könnte es nicht evlt an deiner "WHERE" Klausel liegen?

    Facebamm schrieb:

    Where(item => item["Name"].ToString() == "_Total")
    Sieht für mich eher danach aus, als ob du .EndsWith("_Total") wolltest

    Lg Radinatior
    Schönes Weihnachtsfest Euch allen!
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    _Total glaubt ich existiert gar nicht..
    Ich hab das ganze so probiert:

    VB.NET-Quellcode

    1. Function GetTotalUsage() As Integer
    2. Try
    3. Dim searcher As New ManagementObjectSearcher( _
    4. "root\CIMV2", _
    5. "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor")
    6. Dim total As Integer = 0
    7. Dim c As Integer = 0
    8. For Each queryObj As ManagementObject In searcher.Get()
    9. total += queryObj("PercentProcessorTime")
    10. c += 1
    11. Next
    12. Return CInt(total / c)
    13. Catch err As ManagementException
    14. Return 0
    15. End Try
    16. End Function


    Allerdings muss man dazu sagen, dass es nicht stimmen kann.
    Weil er mir 9 verschiedene Werte ausgibt obwohl ich 8 Cores habe.
    Grundsätzlich sollte Rod's Methode funktionieren.
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @RodFromGermany, @Gather, @Radinator
    Also bei Rod seiner Geschichter bekomme ich immer wieder
    ​System.InvalidOperationException: "Indikatornamensdaten können nicht geladen werden, da ein ungültiger Index "" aus der Registrierung gelesen wurde."

    C#-Quellcode

    1. public static void Main(string[] args) {
    2. while (true) {
    3. PerformanceCounter perf = new PerformanceCounter("Processor", "% Processor Time", "_Total");
    4. Console.WriteLine(perf.NextValue());
    5. Thread.Sleep(20);
    6. }
    7. }


    und zu Gather, bei dir bekomme ich nur null raus
    Spoiler anzeigen

    C-Quellcode

    1. public static void Main(string[] args) {
    2. while (true) {
    3. Console.WriteLine(GetTotalUsage());
    4. Thread.Sleep(20);
    5. }
    6. }
    7. private static int GetTotalUsage() {
    8. try {
    9. ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor");
    10. int total = 0;
    11. int count = 0;
    12. foreach (ManagementObject item in searcher.Get()) {
    13. if (int.TryParse(item["PercentProcessorTime"].ToString(), out int value)) {
    14. total += value;
    15. count += 1;
    16. }
    17. }
    18. return total / count;
    19. } catch {
    20. return 0;
    21. }
    22. }



    Ich hab das ganze mal mit einem Online Tool versucht, nur da klappt es auch bzw. es wird nicht mal "Win32_PerfFormattedData_PerfOS_Processor" gefunden
    1. Liegt das selbst an der CPU bzw Intel/AMD
    2. ich hab auch gelesen das der PerformanceCounter "Kaputt" sein kann und bin dann auf das https://support.microsoft.com/en-us/help/300956/how-to-manually-rebuild-performance-counter-library-values​ dokument gestoßen (Original Beitrag finde ich nicht mehr -.-)

    Facebamm schrieb:

    bekomme ich immer wieder

    W10-64, Studio2013
    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!
    So, ich hab was zusammen gebastelt :D
    könnte das jemand mit überprüfen, denn bei mir ist es nicht exakt ?

    bitte alle >100 ms aufrufen :D

    Spoiler anzeigen

    C#-Quellcode

    1. public class CPU {
    2. [DllImport("kernel32.dll", SetLastError = true)]
    3. private static extern bool GetSystemTimes(out FILETIME lpIdleTime, out FILETIME lpKernelTime, out FILETIME lpUserTime);
    4. //[DllImport("msvcrt.dll", EntryPoint = "memcpy", CallingConvention = CallingConvention.Cdecl, SetLastError = false)]
    5. //private static extern IntPtr memcpy(IntPtr dest, IntPtr src, UIntPtr count);
    6. public static ulong Uses {
    7. get => GetCpuUses();
    8. }
    9. private static ulong ft_sys_idle_old;
    10. private static ulong ft_sys_kernel_old;
    11. private static ulong ft_sys_user_old;
    12. private static ulong GetCpuUses() {
    13. GetSystemTimes(out FILETIME ft_sys_idle, out FILETIME ft_sys_kernel, out FILETIME ft_sys_user);
    14. ulong ft_sys_idle_dalta = ft_sys_idle.value - ft_sys_idle_old;
    15. ulong ft_sys_kernel_dalta = ft_sys_kernel.value - ft_sys_kernel_old;
    16. ulong ft_sys_user_dalta = ft_sys_user.value - ft_sys_user_old;
    17. ulong val = (ft_sys_kernel_dalta + ft_sys_user_dalta - ft_sys_user_dalta) * 100;
    18. val /= ft_sys_kernel_dalta + ft_sys_user_dalta;
    19. ft_sys_idle_old = ft_sys_idle.value;
    20. ft_sys_kernel_old = ft_sys_kernel.value;
    21. ft_sys_user_old = ft_sys_user.value;
    22. return val;
    23. }
    24. [StructLayout(LayoutKind.Sequential)]
    25. private struct FILETIME {
    26. public uint dwLowDateTime { get; private set; }
    27. public uint dwHighDateTime { get; private set; }
    28. public ulong value { get => (((ulong) dwHighDateTime) << 32) + dwLowDateTime; }
    29. }
    30. }