Programa para leer temperatura CPU (sensores)

19/10/2007 - 13:39 por Naimus | Informe spam
Hola a todos,

El caso es que llevo un tiempo desarrollando una aplicación para leer la
temperatura de los sensores de la CPU (no para portátiles), y precisamente lo
único que he conseguido es leer la temperatura de la CPU en portátiles a
través de WMI (en concreto, las clases MAcpi_ThermalZoneTemperature en
root\\WMI y Win32_TemperatureProbe en root\\CIMv2). A continuación expongo el
método que utilizo en la DLL que he creado para verificar si en el ordenador
donde se ejecuta la aplicación dispone de dicha información:

private bool existsTemperatureMethods()
{
string scope1 = "root\\WMI";
string query1 = "select * from MSAcpi_ThermalZoneTemperature";
string scope2 = "root\\CIMV2";
string query2 = "select * from Win32_TemperatureProbe";

Mo1 = new ManagementObjectSearcher(scope1,query1);
Mo2 = new ManagementObjectSearcher(scope2,query2);

Mo1.Options.DirectRead = true;
Mo1.Options.EnumerateDeep = true;
Mo2.Options.DirectRead = true;
Mo2.Options.EnumerateDeep = true;

q1 = Mo1.Get();
q2 = Mo2.Get();
if(q1!=null )
{
try
{
foreach(ManagementObject Q1 in q1)
{
eTMMo1 = true;
this.existsTM = true;
ntemp++;
}
}
catch(System.Management.ManagementException Mex)
{
eTMMo1 = false;
}
}
if(q2!=null)
{
try
{
foreach(ManagementObject Q2 in q2)
{
eTMMo2 = true;
this.existsTM = true;
ntemp++;
}
}
catch(System.Management.ManagementException Mex)
{
eTMMo2 = false;
if(!eTMMo1)
{
existsTM = false;
}
}
}

return this.existsTM;
}

Me he estado informando ampliamente sobre el tema pero no he encontrado nada
concreto sobre cómo obtener dichas temperaturas (que se positivamente que
existen, dado que otros programas como Intel Desktop Utilities, en la placa
modelo DG965WH de intel, los muestran de manera activa...).

Intuyo que debo acceder a la información de los sensores via ACPI, SMBus,
IPMI, etc... pero no he encontrado ningún recurso o explicación
suficientemente clara como para poder desarrollar en c#...)

Espero vuestras respuestas!!!
 

Leer las respuestas

#1 RFOG
19/10/2007 - 14:16 | Informe spam
Hasta donde yo sé no vas a poder si por WMI no se puede.

Tendrás que hacer interop a código nativo, posiblemente a través de la
función de Win32 DeviceIOControl con los valores adecuados, si no
necesitarás algún driver en modo kernel para acceder a los registros de
cada chip de control de temperatura... Y ten en cuenta que en general cada
modelo de placa, chipset, etc seguro que lleva los suyos propios y se
accede de diferente forma.

Seguro que el programa que comentas de Intel está hecho en C++ nativo.

Y aquí es donde se ve claramente la no-adecuación de un
lenguaje/herramienta a los propósitos de una tarea. Igual que a mi no se
me ocurriría hacer un programa de gestión de base de datos en C++ "a pelo"
(que conste que hay bibliotectas que facilitan la tarea), tampoco se me
ocurriría hacer esto en C# y .NET.

En Fri, 19 Oct 2007 13:39:00 +0200, Naimus
escribió:

Hola a todos,

El caso es que llevo un tiempo desarrollando una aplicación para leer la
temperatura de los sensores de la CPU (no para portátiles), y
precisamente lo
único que he conseguido es leer la temperatura de la CPU en portátiles a
través de WMI (en concreto, las clases MAcpi_ThermalZoneTemperature en
root\\WMI y Win32_TemperatureProbe en root\\CIMv2). A continuación
expongo el
método que utilizo en la DLL que he creado para verificar si en el
ordenador
donde se ejecuta la aplicación dispone de dicha información:

private bool existsTemperatureMethods()
{
string scope1 = "root\\WMI";
string query1 = "select * from MSAcpi_ThermalZoneTemperature";
string scope2 = "root\\CIMV2";
string query2 = "select * from Win32_TemperatureProbe";

Mo1 = new ManagementObjectSearcher(scope1,query1);
Mo2 = new ManagementObjectSearcher(scope2,query2);

Mo1.Options.DirectRead = true;
Mo1.Options.EnumerateDeep = true;
Mo2.Options.DirectRead = true;
Mo2.Options.EnumerateDeep = true;

q1 = Mo1.Get();
q2 = Mo2.Get();
if(q1!=null )
{
try
{
foreach(ManagementObject Q1 in q1)
{
eTMMo1 = true;
this.existsTM = true;
ntemp++;
}
}
catch(System.Management.ManagementException Mex)
{
eTMMo1 = false;
}
}
if(q2!=null)
{
try
{
foreach(ManagementObject Q2 in q2)
{
eTMMo2 = true;
this.existsTM = true;
ntemp++;
}
}
catch(System.Management.ManagementException Mex)
{
eTMMo2 = false;
if(!eTMMo1)
{
existsTM = false;
}
}
}

return this.existsTM;
}

Me he estado informando ampliamente sobre el tema pero no he encontrado
nada
concreto sobre cómo obtener dichas temperaturas (que se positivamente que
existen, dado que otros programas como Intel Desktop Utilities, en la
placa
modelo DG965WH de intel, los muestran de manera activa...).

Intuyo que debo acceder a la información de los sensores via ACPI, SMBus,
IPMI, etc... pero no he encontrado ningún recurso o explicación
suficientemente clara como para poder desarrollar en c#...)

Espero vuestras respuestas!!!






Microsoft Visual C++ MVP
==Visita mi blog principal: http://rfog.blogsome.com
Y este sobre programación: http://geeks.ms/blogs/rfog
Libros, ciencia ficción y programación
La verdadera energía y el verdadero caracter son como el valor, tranquilo
y moderado, sin alardes y sin vacilaciones.

Preguntas similares