Temperatura del processore con WMI

mercoledì 08 agosto 2007 - 22.07

koolmind Profilo | Junior Member

Salve a tutti.
Mi è presa la voglia di realizzare una specie di programmino che monitorizzi la temperatura del mio processore...

Leggendo qui e là ho trovato il WMI Code Creator che mi fornisce qualche spunto sul codice da utilizzare... MA NON FUNZIONA!

Io ho scritto un codice C# tipo questo (ometto le parti che non c'entrano nulla):
using System; using System.Windows.Forms; using System.Management; ... private void button2_Click(object sender, EventArgs e) { int conta = 0; try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_TemperatureProbe"); foreach (ManagementObject queryObj in searcher.Get()) { MessageBox.Show("CurrentReading: " + queryObj["CurrentReading"]); conta++; } MessageBox.Show("CONTA: " + conta.ToString()); } catch (ManagementException ex) { MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); } }

Il risultato è una messagebox con scritto "conta: 0", il che significa che non entra mai nel ciclo for! il che implica a sua volta che non ci sono query object in risultato alla query!

COME MAI?? DOVE SBAGLIO??

-----------------------------------------------------------------
koolmind
Dice il saggio: Non ci sono domande difficili, solo risposte che non conosciamo.

Ciciu Profilo | Senior Member

Ciao.
Secondo me Tu non stati sbagliando... Forse, banalmente, la Tua macchina non è in grado di restituire questi dati, perché, banalmente, non ha un BIOS che gestisca la strumentazione. L'SMBIOS è un'estensione del BIOS della scheda madre (rif : http://www.dmtf.org/standards/smbios/).

Ho fatto girare la Tua porzione di codice sulla mia macchina (un notebook Centrino Duo - S.O. Vista) e funziona quasi bene.

Ti ho fatto una piccola modifica, per vedere quali proprità si nascondono nella classe Win32_TemperatureProbe. Devi solo aggiungere una ListBox alla Windows Form, oppure, se sei su una Console Application, usa Console.WriteLine.

int conta = 0; try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_TemperatureProbe"); foreach (ManagementObject queryObj in searcher.Get()) { foreach (PropertyData p in queryObj.Properties) { if (p.Value != null) lstLog.Items.Add(p.Name + " " + p.Value.ToString()); else lstLog.Items.Add(p.Name); } conta++; } MessageBox.Show("CONTA: " + conta.ToString()); } catch (ManagementException ex) { MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); }

Probabilmente la mia macchina supporto l'SMBIOS, perché vedo il MessageBox "Conta" con il valore "1".

Un'altra cosa : Non mi restituisce comunque la temperatura ! Su questo link trovi la spiegazione :

http://msdn2.microsoft.com/EN-US/library/aa394493.aspx

In pratica, la proprietà CurrentReading NON viene caricata !!!!!!!

Spero di essere stato chiaro
Ciao - Fabiog
Fabio G

koolmind Profilo | Junior Member

Interessante informazione.

Ma allora come fa un programma come Everest a rilevare la temperatura se il mio BIOS non ha le librerie adeguate?

-----------------------------------------------------------------
koolmind
Dice il saggio: Non ci sono domande difficili, solo risposte che non conosciamo.

Ciciu Profilo | Senior Member

La Tua domanda è lecita.
Ti risponderò con una banalità e, forse, con la soluzione.

La banalità è che, sebbene il BIOS abbia queste estensioni, la classe Win32_TemperatureProbe NON carica la proprietà CurrentReading.

La soluzione che ho trovato (a questo punto mi hai incuriosito, per cui ho smanettato un po') è la seguente :

int conta = 0; try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature"); foreach (ManagementObject queryObj in searcher.Get()) { foreach (PropertyData p in queryObj.Properties) { if (p.Value != null) lstLog.Items.Add(p.Name + " " + p.Value.ToString()); else lstLog.Items.Add(p.Name); } conta++; } } catch (ManagementException ex) { MessageBox.Show("An error occurred while querying for WMI data: " + ex.Message); }


Tra le proprietà ne troverai una che si chiama "Current Temperature". Questa riporta la temperatura in 0.1 gradi Kelvin. La conversione in gradi Celsius la ottieni sottraendo il valore 2732 e dividendo per 10.

Esempio :

Current Temperature : 3172
In °C : (3172 - 2732 ) / 10 = 44°C

Ora, sulla mia macchina, in realtà, ottengo due set di proprietà, ad indicare che ho due sensori di temperatura, la cui proprietà InstanceName è pari a :

ACPI\ThermalZone\TZS0_0
ACPI\ThermalZone\TZS1_0


Magari è necessario fare qualche ricerca per capire come decodificare questi codici....

Forse "Everest" (qualunque cosa sia) fa proprio questa ricerca.... Prova a vedere se i dati combaciano...

Ciao - FabioG

Fabio G

koolmind Profilo | Junior Member

Ho appena provato il tuo codice: funziona talmente bene che non funziona!

O meglio... ottengo questo errore : AN ERROR OCCURRED WHILE QUERYING FOR WMI DATA: DATO NON SUPPORTATO

Che sarà mai?? C'entra qualcosa il fatto che ho una CPU a 64 bit?


Ma come non sai cosa è Everest?? è il più famoso programma di monitoraggio e benchmarking sul mercato! (http://www.lavalys.com/)

Grazie dell'aiuto!

-----------------------------------------------------------------
koolmind
Dice il saggio: Non ci sono domande difficili, solo risposte che non conosciamo.

Ciciu Profilo | Senior Member

Se vai a questo indirizzo :

http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e&displaylang=en

Puoi scaricare un simpatico software di Microsoft, che Ti permette di navigare tra le classi WMI e, soprattutto, di costruire codice per provarlo.

Prova a cercare questa classe li dentro.... Io l'ho trovata.

Resta il fatto che, Ti garantisco, il codice che Ti ho postato mi funziona. Non so se abbia qualcosa a che fare con la CPU o con il S.O., ma tutto è possibile. Io ho un Notebook Fujitsu (Amilo Pro V3505) con Centrino Duo e WIndows Vista Business.

Ciao - FabioG
Fabio G

koolmind Profilo | Junior Member

Lo avevo già scaricato... infatti il codice che ho postato io veniva proprio da quel programmino. Però a me non funziona, o meglio, il programma gira solo che non ricava nessun dato.

Temo sia un problema di architettura del processore....

-----------------------------------------------------------------
koolmind
Dice il saggio: Non ci sono domande difficili, solo risposte che non conosciamo.

Dave83 Profilo | Newbie

Scusate se riusumo questo thread, ma ho pure io questo problema e non so puiù dove sbattere la testa.
Vorrei fare un programmino per eseguire delle azioni quando la temperatura supera un certo limite (visto che non in rete non ho trovato niente del genere).

Purtroppo però ho anche io gli stessi problemi.
La classe Win32_TemperatureProbe non mi ritorna nessun record e la classe Win32_TemperatureProbe mi dice 'Non supportato'.

Considerate che il programma lo compilo (e testo) su una Asus P6T Deluxe (processore Core i7 920), ma dovrebbe funzionare su una Asus CUV4X-E (processore Pentium3 Coppermine).

Entrambe le schede madri hanno la versione 2.3 dell'SMBIOS.

Qualcuno ha qualche idee su come fare? koolmind sei più riuscito a far qualcosa?
Non c'è un modo per far sì che la prima classe ritorni dei record (magari attivando qualche opzione da bios?)?
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5