2009-07-28 52 views
47

Necesito recopilar información de algún sistema para la aplicación que estoy desarrollando. La memoria disponible y la carga de la CPU son fáciles de obtener con C#. Desafortunadamente, la temperatura de la CPU no es tan fácil. He intentado usar WMI, pero no pude conseguir cualquier cosa usando¿Cómo obtener la temperatura de la CPU?

Win32_TemperatureProbe 

o

MSAcpi_ThermalZoneTemperature 

¿Alguien ya abordado esta cuestión? Me pregunto cómo el seguimiento de los programas, como Clasificador Sandra, puedo obtener esa información ...

Por si acaso 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; 
    } 
} 
+0

Si usted está dispuesto a pagar Me gustaría ver en http://www.cpuid-pro.com si recuerdo bien es la misma biblioteca que 'z-cpu 'usos .. – Peter

Respuesta

19

Estoy bastante seguro 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 una gran cantidad de tableros diferentes, le recomiendo ponerse en contacto con alguien en algo así como SiSoftware o prepárese para leer MUCHOS manuales de la placa base.

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

También puede tener problemas para obtener acceso privilegiado del kernel.

3

Hay una publicación de blog con algún código de muestra de C# sobre cómo hacerlo here.

+1

Eso todavía requiere que el controlador del vendedor lo exponga a través de WMI. – ewanm89

30

Sé que esta publicación es antigua, pero solo quería agregar un comentario si alguien debería mirar esta publicación e intentar encontrar una solución a 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 contenedor que convierte el valor devuelto por WMI y lo envuelve en un objeto fácil de usar.

Recuerde agregar una referencia al 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; 

      } 
     } 
    } 
} 

actualización 25.06.2010:

(Sólo vio que un enlace se envió a la misma clase de solución anterior ... De todos modos, voy a dejar este pedazo de código si alguien debería querer usar él :-))

+7

¿Has leído la pregunta? El OP dijo que ya probó MSAcpi_ThermalZoneTemperature ... –

+0

Esta no es la temperatura de la CPU, creo que es la temperatura de su carcasa. Puedes verificar usando CPUID. – zezba9000

47

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

Siga que li nk y al principio podrías pensar: "hey, esa es una Aplicación, por eso fue eliminada, la pregunta era cómo hacer esto desde el código C#, no para encontrar una aplicación que pueda decirme la temperatura ..." Aquí es donde muestra que no está dispuesto a invertir el tiempo suficiente para leer lo que también es "Open Hardware Monitor".

También incluyen una interfaz de datos, aquí está la descripción:

Interfaz de datos El monitor de hardware abierto publica todos los datos de los sensores a WMI (Windows Management Instrumentation). Esto permite que otras aplicaciones lean y usen la información del sensor también. Una documentación preliminar de la interfaz se puede encontrar here(click).

Cuando lo descarga, contiene la aplicación OpenHardwareMonitor.exe, no lo está buscando. También contiene OpenHardwareMonitorLib.dll, lo está buscando.

En su mayoría, sino es 100%, solo un envoltorio alrededor de la API de WinRing0, que puede elegir para envolver a su auto si así lo desea.

He probado esto desde una aplicación de C# 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 de creer que no esté en el tema de esta pregunta.

+0

¿Puede vincular cualquier documentación sobre el uso de OpenHardware Lib? Parece que no puedo descubrir cómo usar esto en mi proyecto. – CJxD

+0

Desafortunadamente no, usé el antiguo "descubrimiento" para encontrar las cosas que necesitaba ... ¿Pero con qué tienes problemas? ... En lo básico, es crear instancias de la clase "Computadora" y luego trabajar desde allí ... (p.ejComputadora -> IHardware -> ISensors) Alternativamente, descargue la fuente de su repositorio SVN e intente descifrar su propia GUI, personalmente no tuve un problema tan grande como para descubrir cosas, pero si falta algo específico podría ser ¿ser? – Jens

+0

Y con la configuración de su GUI, me refiero como una fuente de inspiración para la forma de acceder a los diversos sensores diferentes y así sucesivamente ... Y luego reproducir ese uso en su propio proyecto. – Jens

1

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

La herramienta WMI Código Creador le permite generar VBScript, C# y VB código .NET que utiliza WMI para completar una tarea de gestión tales como la consulta de de datos de gestión, la ejecución de un método de una clase WMI, o recibiendo notificaciones de eventos usando WMI.

Puede descargarlo here.

1

Depende de si su computadora es compatible con 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 de Open Hardware Monitor. Agregue la referencia de Openhardwaremonitor en Visual Studio. Es mas fácil. Pruebe 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(); 
      } 
     } 
    } 
} 

Debe ejecutar esta demostración como administrador.

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

Cuestiones relacionadas