Cómo obtener la temperatura de la CPU?


Necesito recopilar información del sistema para la aplicación que estoy desarrollando. La memoria disponible y la carga de la CPU son fáciles de obtener usando C#. Desafortunadamente, la temperatura de la CPU no es tan fácil. He intentado usar WMI pero no pude obtener nada usando

Win32_TemperatureProbe

O

MSAcpi_ThermalZoneTemperature

¿Alguien ya se ha ocupado de este tema? Me pregunto cómo los programas de monitoreo, como SiSoftware Sandra, pueden obtener esa información...

En caso de que alguien esté interesado, aquí está el código de la clase:

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;
    }
}
 49
Author: yeyeyerman, 2009-07-28

8 answers

Estoy bastante seguro de que depende del fabricante, ya que se accederá a ellos a través de un puerto de E/S. Si tiene una placa específica con la que está tratando de trabajar, intente consultar los manuales y/o ponerse en contacto con el fabricante.

Si desea hacer esto para muchas placas diferentes, le recomendaría ponerse en contacto con alguien en algo como SiSoftware o estar preparado para leer muchos manuales de placas base.

Como otra nota, no todas las placas tienen monitores de temperatura.

Usted también podría tener problemas para obtener acceso privilegiado desde el núcleo.

 19
Author: samoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 17:50:55

Para otros que pueden venir por aquí, tal vez echar un vistazo a: http://openhardwaremonitor.org /

Siga ese enlace y al principio podría pensar: "oye, eso es una Aplicación, por eso se eliminó, la pregunta era cómo hacer esto desde el código C#, no para encontrar una aplicación que me pueda decir la temperatura..."Aquí es donde muestra que no está dispuesto a invertir suficiente tiempo en leer lo que también es "Open Hardware Monitor".

También incluyen un Dato Interfaz, aquí está la descripción:

Interfaz de datos El Monitor de Hardware Abierto publica todos los datos del sensor para WMI (Instrumentación de Administración de Windows). Esto permite que otros aplicaciones para leer y utilizar la información del sensor también. Un la documentación preliminar de la interfaz se puede encontrar aquí(haga clic).

Cuando lo descarga, contiene el monitor OpenHardwareMonitor.solicitud exe, no estás buscando esa. También contiene el OpenHardwareMonitorLib.dll, estás buscando.

Es en su mayoría, si no 100%, solo un envoltorio alrededor de la API WinRing0, que puede elegir para envolver su auto si lo desea.

He probado esto desde una aplicación de C# yo mismo, y funciona. Aunque todavía está en beta, parecía bastante estable. También es de código abierto, por lo que podría ser un buen punto de partida.

Al final del día me resulta difícil creer que no esté en el tema de esta pregunta.

 50
Author: Jens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-07 11:28:09

Sé que este post es viejo, pero solo quería agregar un comentario si alguien debería estar mirando este post y tratando de encontrar una solución para este problema.

De hecho, puede leer la temperatura de la CPU muy fácilmente en C# utilizando un enfoque WMI.

Para obtener un valor Celsius, he creado un wrapper que convierte el valor devuelto por WMI y lo envuelve en un objeto fácil de usar.

Recuerde agregar una referencia a System.Management.dll en 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;

            }
        }
    }
}

Actualizar 25.06.2010:

(Acabo de ver que se publicó un enlace al mismo tipo de solución anterior... De todos modos, dejaré este fragmento de código si alguien quiere usarlo: -))

 30
Author: Lasse Rasch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-12 17:58:28

Hay una entrada de blog con un código de ejemplo de C# sobre cómo hacerlo aquí.

 3
Author: Jon Grant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-28 16:13:38

Depende de si su equipo soporta WMI. Mi computadora no puede ejecutar esta demostración de WMI también.

Pero obtengo con éxito la temperatura de la CPU a través del Monitor de Hardware abierto. Agregue la referencia de Openhardwaremonitor en Visual Studio. Es más fácil. Prueba esto

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();
           }
       }
   }
}

Necesita ejecutar esta demo como administrador.

Puedes ver el tutorial aquí: http://www.lattepanda.com/topic-f11t3004.html

 2
Author: haoming weng,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-02 02:54:00

Se puede hacer en su código a través de WMI. He encontrado una herramienta de Microsoft que crea código para ella.

La herramienta WMI Code Creator le permite generar VBScript, C# y VB Código. NET que utiliza WMI para completar una tarea de administración, como consultas para datos de administración, ejecutar un método desde una clase WMI o recibir notificaciones de eventos mediante WMI.

Puede descargarlo aquí.

 1
Author: Jet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-09 08:41:11

Extraje la parte de la CPU del Monitor de Hardware abierto en una biblioteca separada, exponiendo sensores y miembros normalmente ocultos en OHM. También incluye muchas actualizaciones (como el soporte para Ryzen y Xeon) porque en OHM no aceptan solicitudes de extracción desde 2015.

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

Deja saber tu opinión:)

 0
Author: TheQult,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-05 10:40:15

Puede darle una oportunidad al Monitor de Hardware Abierto, aunque carece de soporte para los últimos procesadores.

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
        }
    }
}

Descargue el zip de la fuente oficial , extraiga y agregue una referencia a OpenHardwareMonitorLib.dll en tu proyecto.

 0
Author: Ali Zahid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-08 06:56:54