PDA

Visualizza versione completa : Misura della temperatura del processore con vb6


mandrak
11-08-2009, 14.18.00
Salve a tutti.
Ho altro quesito da chiedere.
Mi piacerebbe creare con vb6 o Vb5 un softwarino che legge
la temperatura del processore se la scheda madre lo prevede.
So che ci sono già pronti e anche Free, ma sarebbe una mia
piccola soddisfazione crearne uno da me.
Da dove devo iniziare ?
Quali sono i registri da consultare e come ?
magari un piccolo esempio ...
:)

chiccogio
01-09-2009, 22.58.15
Ho trovato in giro su internet questo...forse potrebbe essere di aiuto?

Imports System
Imports System.Management

Public Class frmMain

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Dim searcher As New ManagementObjectSearcher("root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature")

For Each queryObj As ManagementObject In searcher.Get()
Dim temp As Double = CDbl(queryObj("CurrentTemperature"))
temp = (temp - 2732) / 10.0
MessageBox.Show(temp.ToString)
Next

Catch ex As ManagementException
MessageBox.Show(ex.Message)
End Try

End Sub

End Class

LoryOne
01-09-2009, 23.31.59
"Quali sono i registri da consultare e come ?"

L'esempio che hai riportato non è proprio in Vb5/6, anche se a WMI potresti accedere comunque attraverso l'utilizzo di un componente aggiuntivo ...
Certo, WMI è pratico ma la domanda rimane quella lassù ;)

Semi.genius
02-09-2009, 09.02.42
Dipende dal driver della scheda madre, la lettura della temperatura...non c'è una API standard. Bisogna importare la funzione specifica dalla dll (stile asus.dll ha GetCPUTemperature)

LoryOne
02-09-2009, 09.48.39
Mmm ... l'esempio fa accesso ad ACPI ... al BIOS.
A quale indirizzo punta MSAcpi_ThermalZoneTemperature ?
Certo, hai ragione anche tu Semi.genius ... Se Asus ha predisposto una dll specifica per le sue schede madri, il reversing della chiamata GetCPUTemperature potrebbe forse rivelarcelo ?
E se ACPI fosse uno standard ? Qualunque scheda madre che lo supporti potrebbe fornirci la lettura della temperatura , ed in questo caso WMI potrebbe avere davvero senso ...

P8257 WebMaster
02-09-2009, 09.59.13
Anche secondo me l'uso di WMI ha un senso in questo caso, molti software di rilevazione come il ben noto SpeedFan ne fanno uso appoggiandosi anche alle API del controllo delle performance di windows (perfos.dll)

Appoggiarsi ad un driver specifico del produttore dell'hardware implica dover gestire chiamate che possono essere diverse per modello di scheda madre, inoltre alle volte possono differire anche tra revisioni degli stessi driver.
Lo standard ACPI è ormai largamente supportato dall'hardware e il sistema dispone dei relativi performance coutners per cui a mio avviso una query wmi è senz'altro da preferire...

mandrak
02-09-2009, 11.35.36
Salve a tutti.
Cos'è WMI ?
E' un software aggiuntivo da installare e come si usa ?

P8257 WebMaster
02-09-2009, 11.46.40
WMI ovvero Windows Management Instrumentation (strumentazione gestione windows) è un'infrastruttura integrata nel sistema operativo che, attraverso un processo host (wmiprvse) - wmi provider service permette di eseguire interrogazioni a livello programmatico sul sistema utilizzando una sintassi molto simile a t-sql per sottoporre query riguardanti la configurazione hardware e software del sistema.

Praticamente è un servizio integrato che ti fornisce informazioni sul sistema.

Semi.genius
02-09-2009, 12.00.57
uhm..siete sicuri che con WMI si possa ricavare la temperatura? iirc, si può sapere le informazioni sul sensore, ma il valore "CurrentReading" non lo popola...
http://msdn.microsoft.com/en-us/library/aa394493(VS.85).aspx

..come è scritto qui...

P8257 WebMaster
02-09-2009, 12.19.40
Questo codice :


Try

Dim searcher As New ManagementObjectSearcher("root\WMI", "SELECT * FROM MSAcpi_ThermalZoneTemperature")
For Each queryObj As ManagementObject In searcher.Get()
Dim temp As Double = CDbl(queryObj("CurrentTemperature"))
temp = (temp - 2732) / 10.0
MessageBox.Show(temp.ToString)
Next
Catch err As ManagementException
MessageBox.Show("An error occurred while querying for WMI data: " & err.Message)
End Try



Già postato in precedenza funziona, almeno sul mio sistema, di solito wmi si interfaccia con il bios per fare queste rilevazioni (smb) che è implementato dal driver del produttore della scheda madre o dai driver standard microsoft per cui la comodità è che in questo caso wmi fornisce l'astrazione del dato.
Chiedo scusa all'utente che ha iniziato il thread per non aver postato codice vb5 o vb6 se non ricordo male per l'interazione wmi occorre un componente aggiuntivo.

mandrak
02-09-2009, 15.00.12
Ci mancherebbe altro, vi ringrazio tutti.
:act: :act:
Per provare il codice che hai messo a disposizione occorre prima installare WMI presumo.
Usando vb5&6 devo scaricare un particolare file di installazione o è sufficiente entrare nel Sito della Microsoft ?
Qual'è il link più giusto ?
:) :) :)

P8257 WebMaster
02-09-2009, 15.04.21
WMI non si installa, è integrato in windows...

P8257 WebMaster
02-09-2009, 15.17.57
Con il metodo getobject di vb6 recuperi l'"istanza" di wmi su cui fare la query, guarda questo link e magari prova direttamente dato che (se non ricordo male) alcuni provider sono preinstallati nel sistema, probabilmente non avrai bisogno di librerie aggiuntive

http://www.eggheadcafe.com/tutorials/aspnet/5fb2b0ca-919a-406b-8566-a9d07f76c868/wmi--vb-60-windows-mana.aspx

Se invece l'istruzione getobject ritorna errore oppure Nothing allora occorre cercare una libreria di interfacciamento per wmi con vb.

mandrak
02-09-2009, 16.32.11
L'esempio che è scritto sul Link funziona.
Mi restituisce l'elenco dei programmi (processi) in esecuzione nella macchina.
Ma come faccio ad adattarlo alle mie esigenze ?
Mi sento molto ignorante sull'argomento.
:wall:

P8257 WebMaster
02-09-2009, 16.41.55
Bene, vuol dire che non hai bisogno di provider aggiuntivi in quanto la tua vb virtual machine lo include già...

Per il codice, devi fare un porting tra vb.net e vb6, viene una cosa simile a questa:


dim coltemp
dim objtemp

' forse anche così :
' Set coltemp = GetObject("Winmgmts:root\WMI").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")
Set coltemp = GetObject("Winmgmts:").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")

For Each objtemp In colProcessList
List1.AddItem "Temp =" & objtemp.CurrentTemperature
Next

' set oggetti = nothing

End Sub




Non l'ho provato, controlla le proprietà dell'oggetto objtemp restituito dalla query...

LoryOne
02-09-2009, 18.38.48
Qui c'è molto di più di quello che fa al caso tuo: http://www.freevbcode.com/ShowCode.Asp?ID=9411
Scaricati il file zippato e lancia l'applicativo compilato ... Meravilgioso (Y)

mandrak
03-09-2009, 13.54.58
Ciao
Ho provato a inserire il seguente codice nell'evento Load:
_____
Private Sub Form_Load()
Dim coltemp
Dim objtemp
Set coltemp = GetObject("Winmgmts:").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")
For Each objtemp In coltemp
List1.AddItem "Temp =" & objtemp.CurrentTemperature
Next
Set coltemp = Nothing
Set objtemp = Nothing

End Sub
___________

ma mi restituisce il seguente errore di "automazione":
Errore di run time : -2147217392 (80041010)

P8257 WebMaster
03-09-2009, 14.13.04
Hai provato anche ad usare l'alternativa ....:

Set coltemp = GetObject("Winmgmts:root\WMI").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")

mandrak
03-09-2009, 15.04.12
Ciao
Ho inserito il seguente codice nell' evento load della form:
Private Sub Form_Load()
Dim coltemp
Dim objtemp
Set coltemp = GetObject("Winmgmts:").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")
For Each objtemp In coltemp
List1.AddItem "Temp =" & objtemp.CurrentTemperature
Next
Set coltemp = Nothing
Set objtemp = Nothing

Al Run, mi restituisce un errore di "automazione" errore di run time -2147217392

P8257 WebMaster
03-09-2009, 15.38.59
Rimane la questoine sopra .. : hai provato la dichiarazione alternativa di coltemp ?

mandrak
03-09-2009, 17.32.22
Scusate prima avevo scritto due volte la stessa risposta.
(quando ho scritto la prima risposta sembrava che non l'avesse inserita e
l'ho ridigitata tutta, non mi ero accorto che c'erano due pagine).
:wall:
Allora ... ho provato l'altenativa e funge.
:)
Private Sub Form_Load()
Dim coltemp
Dim objtemp
Dim temperatura As Integer
Set coltemp = GetObject("Winmgmts:root\WMI").ExecQuery("SELECT * FROM MSAcpi_ThermalZoneTemperature ")
For Each objtemp In coltemp
temperatura = (objtemp.CurrentTemperature - 2732) / 10#
List1.AddItem "Temp =" & temperatura
Next
Set coltemp = Nothing
Set objtemp = Nothing
End Sub

Ho però dovuto inserire la formuma perche mi dava un valore di oltre 2000 °C
Con la formula mi risponde con 22 °C, già più accettabile ma forse troppo basso.
per verificare dovrei accedere al bios per sapere il valore corretto e poi adattare la formula, comunque funziona.
grazie di tutto. :act:
Guarderò anche il link http://www.freevbcode.com/ShowCode.Asp?ID=9411
grazie :act:

P8257 WebMaster
03-09-2009, 17.43.30
Il valore che ti restituisce è già il valore del bios, è sicuramente sbagliato (a meno che tu non raffreddi il pc utilizzando il liquido) perché tutti i sensori hanno dei grandi margini di errore, dipendono dalla qualità dei sensori stessi, da dove i sensori sono piazzati e dalla versione del software del bios...