web-dev-qa-db-fra.com

Comment obtenir la température du CPU?

J'ai besoin de rassembler des informations sur le système pour l'application que je développe. La mémoire disponible et la charge CPU sont faciles à obtenir en utilisant C #. Malheureusement, la température du processeur n'est pas si simple. J'ai essayé d'utiliser WMI mais je n'ai rien pu utiliser

Win32_TemperatureProbe

ou

MSAcpi_ThermalZoneTemperature

Quelqu'un a-t-il déjà traité ce problème? Je me demande comment les programmes de surveillance, comme SiSoftware Sandra, peuvent obtenir ces informations ...

Juste au cas où quelqu'un serait intéressé, voici le code de la classe:

public class SystemInformation
{
    private System.Diagnostics.PerformanceCounter m_memoryCounter;
    private System.Diagnostics.PerformanceCounter m_CPUCounter;

    public SystemInformation()
    {
        m_memoryCounter = new System.Diagnostics.PerformanceCounter();
        m_memoryCounter.CategoryName = "Memory";
        m_memoryCounter.CounterName = "Available MBytes";

        m_CPUCounter = new System.Diagnostics.PerformanceCounter();
        m_CPUCounter.CategoryName = "Processor";
        m_CPUCounter.CounterName = "% Processor Time";
        m_CPUCounter.InstanceName = "_Total"; 
    }

    public float GetAvailableMemory()
    {
        return m_memoryCounter.NextValue();
    }

    public float GetCPULoad()
    {
        return m_CPUCounter.NextValue();
    }

    public float GetCPUTemperature()
    {
        //...
        return 0;
    }
}
54
yeyeyerman

Je suis sûr que cela dépend du fabricant, car ils seront accessibles via un port d'E/S. Si vous avez une carte spécifique avec laquelle vous essayez de travailler, essayez de consulter les manuels et/ou de contacter le fabricant.

Si vous souhaitez le faire pour de nombreuses cartes différentes, je vous recommande de contacter quelqu'un à quelque chose comme SiSoftware ou d'être prêt à lire BEAUCOUP de manuels sur les cartes mères.

Autre remarque, toutes les cartes n'ont pas de moniteur de température.

Vous pourriez également rencontrer des problèmes pour obtenir un accès privilégié à partir du noyau.

19
samoz

Pour ceux qui pourraient venir ici, jetez un œil à: http://openhardwaremonitor.org/

Suivez ce lien et au début, vous pourriez penser: "Hé, c'est une application, c'est pourquoi elle a été supprimée, la question était de savoir comment faire cela à partir du code C #, pas de trouver une application qui puisse me dire la température ..." C'est là que cela montre que vous n'êtes pas prêt à investir suffisamment de temps pour lire ce qu'est également "Open Hardware Monitor".

Ils comprennent également une interface de données, voici la description:

Interface de données L'Open Hardware Monitor publie toutes les données des capteurs sur WMI (Windows Management Instrumentation). Cela permet à d'autres applications de lire et d'utiliser également les informations du capteur. Une documentation préliminaire de l'interface peut être trouvée ici (cliquez) .

Lorsque vous le téléchargez, il contient l'application OpenHardwareMonitor.exe, vous ne la recherchez pas. Il contient également le fichier OpenHardwareMonitorLib.dll que vous recherchez.

C'est surtout, sinon à 100%, juste un wrapper autour de l'API WinRing0, que vous pouvez choisir de vous envelopper si vous en avez envie.

J'ai moi-même essayé cela à partir d'une application C #, et cela fonctionne. Bien qu'il soit encore en version bêta, il semblait plutôt stable. Il est également open source, il pourrait donc être un bon point de départ.

À la fin de la journée, j'ai du mal à croire que ce n'est pas le sujet de cette question.

55
Jens

Je sais que ce message est ancien, mais je voulais juste ajouter un commentaire si quelqu'un devait le consulter et essayer de trouver une solution à ce problème.

Vous pouvez en effet lire très facilement la température du CPU en C # en utilisant une approche WMI.

Pour obtenir une valeur Celsius, j'ai créé un wrapper qui convertit la valeur retournée par WMI et l'enveloppe en un objet facile à utiliser.

N'oubliez pas d'ajouter une référence au System.Management.dll dans Visual Studio.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Management;

namespace RCoding.Common.Diagnostics.SystemInfo
{
    public class Temperature
    {
        public double CurrentValue { get; set; }
        public string InstanceName { get; set; }
        public static List<Temperature> Temperatures
        {
            get
            {
                List<Temperature> result = new List<Temperature>();
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(@"root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature");
                foreach (ManagementObject obj in searcher.Get())
                {
                    Double temp = Convert.ToDouble(obj["CurrentTemperature"].ToString());
                    temp = (temp - 2732) / 10.0;
                    result.Add(new Temperature { CurrentValue = temp, InstanceName = obj["InstanceName"].ToString() });
                }
                return result;

            }
        }
    }
}

Mise à jour 25.06.2010:

(Je viens de voir qu'un lien a été posté vers le même type de solution ci-dessus ... Quoi qu'il en soit, je vais laisser ce morceau de code si quelqu'un veut l'utiliser :-))

31
Lasse Rasch

J'ai extrait la partie CPU d'Open Hardware Monitor dans une bibliothèque séparée, exposant les capteurs et les membres normalement cachés dans OHM. Il comprend également de nombreuses mises à jour (comme la prise en charge de Ryzen et Xeon) car sur OHM, ils n'acceptent pas les demandes de tirage depuis 2015.

https://www.nuget.org/packages/HardwareProviders.CPU.Standard/

Faites connaître votre opinion :)

3
TheQult

Vous pouvez essayer Open Hardware Monitor, même s'il ne prend pas en charge les derniers processeurs.

internal sealed class CpuTemperatureReader : IDisposable
{
    private readonly Computer _computer;

    public CpuTemperatureReader()
    {
        _computer = new Computer { CPUEnabled = true };
        _computer.Open();
    }

    public IReadOnlyDictionary<string, float> GetTemperaturesInCelsius()
    {
        var coreAndTemperature = new Dictionary<string, float>();

        foreach (var hardware in _computer.Hardware)
        {
            hardware.Update(); //use hardware.Name to get CPU model
            foreach (var sensor in hardware.Sensors)
            {
                if (sensor.SensorType == SensorType.Temperature && sensor.Value.HasValue)
                    coreAndTemperature.Add(sensor.Name, sensor.Value.Value);
            }
        }

        return coreAndTemperature;
    }

    public void Dispose()
    {
        try
        {
            _computer.Close();
        }
        catch (Exception)
        {
            //ignore closing errors
        }
    }
}

Téléchargez le Zip à partir du source officielle , extrayez et ajoutez une référence à OpenHardwareMonitorLib.dll dans votre projet.

3
Ali Zahid

Cela dépend si votre ordinateur prend en charge WMI. Mon ordinateur ne peut pas non plus exécuter cette démo WMI.

Mais j'ai réussi à obtenir la température du processeur via Open Hardware Monitor. Ajoutez la référence Openhardwaremonitor dans Visual Studio. C'est plus facile. Essaye ça

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenHardwareMonitor.Hardware;
namespace Get_CPU_Temp5
{
   class Program
   {
       public class UpdateVisitor : IVisitor
       {
           public void VisitComputer(IComputer computer)
           {
               computer.Traverse(this);
           }
           public void VisitHardware(IHardware hardware)
           {
               hardware.Update();
               foreach (IHardware subHardware in hardware.SubHardware) subHardware.Accept(this);
           }
           public void VisitSensor(ISensor sensor) { }
           public void VisitParameter(IParameter parameter) { }
       }
       static void GetSystemInfo()
       {
           UpdateVisitor updateVisitor = new UpdateVisitor();
           Computer computer = new Computer();
           computer.Open();
           computer.CPUEnabled = true;
           computer.Accept(updateVisitor);
           for (int i = 0; i < computer.Hardware.Length; i++)
           {
               if (computer.Hardware[i].HardwareType == HardwareType.CPU)
               {
                   for (int j = 0; j < computer.Hardware[i].Sensors.Length; j++)
                   {
                       if (computer.Hardware[i].Sensors[j].SensorType == SensorType.Temperature)
                               Console.WriteLine(computer.Hardware[i].Sensors[j].Name + ":" + computer.Hardware[i].Sensors[j].Value.ToString() + "\r");
                   }
               }
           }
           computer.Close();
       }
       static void Main(string[] args)
       {
           while (true)
           {
               GetSystemInfo();
           }
       }
   }
}

Vous devez exécuter cette démo en tant qu'administrateur.

Vous pouvez voir le tutoriel ici: http://www.lattepanda.com/topic-f11t3004.html

2
haoming weng

Il y a un article de blog avec un exemple de code C # sur la façon de le faire ici .

2
Jon Grant

Cela peut être fait dans votre code via WMI. J'ai trouvé un outil de Microsoft qui crée du code pour cela.

L'outil WMI Code Creator vous permet de générer du code VBScript, C # et VB .NET qui utilise WMI pour effectuer une tâche de gestion telle que la recherche de données de gestion, l'exécution d'une méthode à partir d'une classe WMI, ou recevoir des notifications d'événements à l'aide de WMI.

Vous pouvez le télécharger ici .

1
Jet