VB.NET – CoreTemp Werte in der eigenen Anwendung
Das nützliche Tool CoreTemp hatte ich bereits in dem Beitrag “Tools die man Braucht – Teil6 – CoreTemp” vorgestellt. CoreTemp verfügt über über eine Loogingfunktion um die Temperaturen der einzelnen Cores auszulesen und in einer CSV zu dokumentieren. Möchte man aber nun in seiner eigenen Anwendung die CPU/Core Temperatur veranschaulichen, geht dies zum einen über WMI, welches aber keine vernünftigen Werte liefert. Der andere Weg führt über die GetCoreTempInfoNET.dll welche über die CoreTemp/Developer Website bezogen werden kann. Diese DLL kann in VisualStudio oder SharpDevelop eingebunden werden um so auf die enthalten Funktionen zugeiffen zu können. Wie dies geht werde ich in einen kleinen Quellcode Beispiel erläutern.
Einbinden der DLL in SharpDevelop
In einen Neuerstellten Projekt öffnet man den Referenzdialog, dieser ist über Menü Projekt > Referenz hinzufügen erreichbar. Mit Klick auf “Suchen” im Karteireiter “.NET Assemblybrowser” wählt man die GetCoreTempInfoNET.dll aus. Mit klick auf “OK” ist die Datei eingebunden und kann genutzt werden.
Quellcode
Zuerst benötigt man ein paar Variablen und erstellt den Namespace für die DLL
Imports GetCoreTempInfoNET
Public cpu_typ As String
Public cpu_speed As String
Public cpu_vid As String
Public cpu_phy_count As String
Public cpu_core_count As String
Public cpu_core_load(3) As String
Public cpu_core_temp(3) As String
Public cpu_fsb As String
Public cpu_multi As String
Desweiteren wird ein Timer benötigt der die Temperatur nach einer bestimmten Zeit aktualisiert.
Class MainForm
Public CTInfo As CoreTempInfo
Public Sub New()
Me.InitializeComponent()
CTInfo = New CoreTempInfo()
AddHandler CTInfo.ReportError, AddressOf CTInfo_ReportError
End Sub
CTInfo erstellen, Errorhandler erstellen
die Prozedur
Public Sub get_coretemp(ByVal sender As Object, ByVal e As ElapsedEventArgs)
'CoreTemp Daten aus dem Speicher holen
Dim bReadSuccess As Boolean = CTInfo.GetData()
'wenn erfolgreich dann Daten lesen
und in Variablen speichern
If bReadSuccess Then
Dim index As UInteger
'CPU Daten in speichern
cpu_typ = CTInfo.GetCPUName
cpu_speed = CTInfo.GetCPUSpeed & " MHz "
cpu_vid = CTInfo.GetVID
cpu_phy_count = CTInfo.GetCPUCount
cpu_core_count = CTInfo.GetCoreCount
cpu_multi = CTInfo.GetMultiplier
cpu_fsb = CTInfo.GetFSBSpeed
cpu_max_temp(0) = CTInfo.GetTjMax(0)
cpu_max_temp(1) = CTInfo.GetTjMax(1)
cpu_max_temp(2) = CTInfo.GetTjMax(2)
cpu_max_temp(3) = CTInfo.GetTjMax(3)
'einzelne Temperaturen der Cores lesen
For i As UInteger = 0 To CTInfo.GetCPUCount - 1
For g As UInteger = 0 To CTInfo.GetCoreCount - 1
index = g + (i * CTInfo.GetCoreCount)
If CTInfo.IsDistanceToTjMax Then
cpu_core_temp(index) = _
CTInfo.GetTemp(index)
cpu_core_load(index) = _
CTInfo.GetCoreLoad(index)
Else
cpu_core_temp(index) = _
CTInfo.GetTemp(index)
cpu_core_load(index) = _
CTInfo.GetCoreLoad(index)
End If
Next
Next
Else
'wenn die CPU nicht erkannt
werden konnte
messagebox.Show("Fehler Name: _
" + CTInfo.GetLastError().ToString())
messagebox.Show("Fehler: _
" + CInt(CTInfo.GetLastError).ToString())
messagebox.Show("Fehler Nachricht: _
" + CTInfo.GetErrorMessage(CTInfo.GetLastError))
Timer_cpu.enabled = False
End If
End Sub
Timer
Sub Timer_cpuTick(sender As Object, e As EventArgs)
'Prozedur aufrufen
get_coretemp(Nothing, Nothing)
'Temperaturen an Label übergeben
lbl_core_1.Text = cpu_core_temp(0)
lbl_core_2.text = cpu_core_temp(1)
lbl_core_3.text = cpu_core_temp(2)
lbl_core_4.text = cpu_core_temp(3)
'Auslastung an Label übergeben
lbl_cpu_load_1.Text = cpu_core_load(0)
lbl_cpu_load_2.Text = cpu_core_load(1)
lbl_cpu_load_3.Text = cpu_core_load(2)
lbl_cpu_load_4.Text = cpu_core_load(3)
'weitere Daten übergeben
lbl_cpu_name.text = cpu_typ
lbl_fsb.Text = cpu_fsb
lbl_multi.Text = cpu_multi
lbl_speed.Text = cpu_speed
lbl_vcore.Text = cpu_vid
End Sub
Der Intervall des Timers kann frei nach belieben gewählt werden. Eine Sekunde macht sich hier ganz gut.
Fehlerbehandlung
Public Sub CTInfo_ReportError(ByVal ErrCode As ErrorCodes, _
ByVal ErrMsg As String)
Message.show(ErrMsg)
End Sub
Hinweis: CoreTemp muß zum gleichen Zeitpunkt laufen wie Ihre Anwendung um die Daten direkt von CoreTemp zulesen.