VB.NET – CoreTemp Werte in der eigenen Anwendung

cpu_infoDas 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.
sharp_ref
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.