73 votes

Comment obtenir la température du CPU ?

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

Win32_TemperatureProbe

ou

MSAcpi_ThermalZoneTemperature

Quelqu'un a-t-il déjà eu affaire à 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;
    }
}

0 votes

Si vous êtes prêt à payer, je me pencherais sur les points suivants cpuid-pro.com si je me souviens bien, c'est la même bibliothèque que z-cpu utilise

80voto

Jens Points 910

Pour les autres qui passeraient par ici, jetez un coup d'œ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 peut 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, dont voici la description :

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

Lorsque vous le téléchargez, il contient l'application OpenHardwareMonitor.exe, ce n'est pas celle-là que vous recherchez. Il contient aussi OpenHardwareMonitorLib.dll, c'est celui-là que vous cherchez.

Il s'agit principalement, sinon à 100 %, d'une enveloppe autour de l'API WinRing0, que vous pouvez choisir d'envelopper vous-même si vous en avez envie.

J'ai moi-même testé cette méthode à partir d'une application C#, et elle fonctionne. Bien qu'il soit encore en version bêta, il semble plutôt stable. Il s'agit également d'un logiciel libre, qui pourrait donc constituer un bon point de départ.

En fin de compte, je trouve difficile de croire que ce n'est pas le sujet de cette question.

1 votes

Pouvez-vous indiquer une documentation sur l'utilisation de la bibliothèque OpenHardware ? Je n'arrive pas à trouver comment l'utiliser dans mon projet.

0 votes

Malheureusement non, j'ai utilisé la bonne vieille "découverte" pour trouver les choses dont j'avais besoin... Mais avec quoi avez-vous des problèmes ?... A la base, il s'agit d'instancier la classe "Computer" et de travailler ensuite à partir de là... (par exemple, Computer -> IHardware -> ISensors) Vous pouvez aussi télécharger les sources de leur dépôt SVN et essayer de comprendre leur propre interface graphique. Personnellement, je n'ai pas eu de gros problèmes pour découvrir les choses, mais si quelque chose de spécifique vous manque, c'est peut-être le cas ?

0 votes

Et avec la compréhension de leur interface graphique, je veux dire comme une source d'inspiration pour savoir comment accéder aux différents capteurs et ainsi de suite... Et puis reproduire cette utilisation dans votre propre projet.

40voto

Lasse Rasch Points 161

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

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

Pour obtenir une valeur Celsius, j'ai créé un wrapper qui convertit la valeur renvoyée par WMI et l'intègre dans un objet facile à utiliser.

N'oubliez pas d'ajouter une référence à la 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 laisserai ce morceau de code si quelqu'un veut l'utiliser :-) )

10 votes

Avez-vous lu la question ? L'OP dit qu'il a déjà essayé MSAcpi_ThermalZoneTemperature...

1 votes

Ce n'est pas la température du CPU, je pense que c'est la température du boîtier. Vous pouvez vérifier en utilisant CPUID.

0 votes

Je ne sais pas ce que ce code essaie de faire, mais j'ai obtenu la valeur -267.8.

23voto

samoz Points 14652

Je suis presque sûr que ça dépend du fabricant, puisqu'on y accède par 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 voulez faire cela pour un grand nombre de cartes différentes, je vous recommande de contacter quelqu'un comme SiSoftware ou de vous préparer à lire BEAUCOUP de manuels de cartes mères.

Par ailleurs, toutes les cartes ne sont pas dotées de contrôleurs de température.

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

2voto

Jon Grant Points 7560

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

1 votes

Pour cela, il faut encore que le pilote du fournisseur l'expose via WMI.

2voto

Jet Points 235

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 qu'une requête de données de gestion, l'exécution d'une méthode d'une classe WMI ou la réception de notifications d'événements à l'aide de WMI.

Vous pouvez le télécharger ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X