Unten ist so weit wie ich habe. Ich habe nicht mehr Zeit dafür, also überlasse ich dir den Rest der Nachforschungen.
Ich konnte keine Dokumentation überhaupt finden. Es gibt nicht einmal XML-Kommentare im Code, also habe ich den Quellcode durchforstet, um so weit wie möglich zu kommen. Du wirst dasselbe tun müssen.
Das erste, was Sie vermissen, ist, dass Sie die Computer.CPUEnabled
Eigenschaft auf True setzen müssen, bevor Sie Computer.Open
anrufen. Dies bewirkt, dass Open ein CPU-Hardwaregerät hinzufügt.
Die zweite Sache, die Sie vermissen, ist, dass Sie Computer.Open
anrufen müssen.
Die dritte Sache, die Sie vermissen, ist, dass Sie Hardware.Update
aufrufen müssen, damit es die Hardware neu abfragt.
Die vierte Sache, die Sie verpassen, ist, dass der Sensorwert ein Nullable<float>
ist. Sie müssen prüfen, ob dort ein gültiger Wert vorhanden ist.
Das ist immer noch nicht genug. Obwohl es jetzt vier Temperatursensoren (an meiner Maschine) gibt, gibt es nie einen Temperaturwert.
Ich durchforstete die Einstellungen und fand, dass es diese langen Initialisierungspunkte für die CPU- und CPU-Temperatur gibt. Ich habe Code hinzugefügt, um diese Einstellungen in die Computer
(zumindest für einen der Kerne) zu setzen, aber es hatte keine Wirkung.
Was ist dieser Aufruf IntelCpu.Update
versagt
Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx, 1UL << cpuid[i][0].Thread)
Deshalb habe ich es vermute, einige fehlende Initialisierung.
Viel Glück!
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using OpenHardwareMonitor.Hardware;
namespace WindowsFormsApplication1
{
public class MySettings : ISettings
{
private IDictionary<string, string> settings = new Dictionary<string, string>();
public MySettings(IDictionary<string, string> settings)
{
this.settings = settings;
}
public bool Contains(string name)
{
return settings.ContainsKey(name);
}
public string GetValue(string name, string value)
{
string result;
if (settings.TryGetValue(name, out result))
return result;
else
return value;
}
public void Remove(string name)
{
settings.Remove(name);
}
public void SetValue(string name, string value)
{
settings[name] = value;
}
}
public class Form1 : Form
{
Computer myComputer;
Timer timer = new Timer { Enabled = true, Interval = 1000 };
public Form1()
{
timer.Tick += new EventHandler(timer_Tick);
MySettings settings = new MySettings(new Dictionary<string, string>
{
{ "/intelcpu/0/temperature/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9/+NX6N3/TJm9/5f/01fw1+fosnv+A/+OlfS37/jZ/s/Lpv9fff6Ml/NTef/yZPnozc5679b+i193//TQZ+/w2Dd+P9/sZeX/67v/GTf/b3iP3u4/ObBL//73+i+f039+D8Zk/+xz/e/P6beu2TQZju8yH8f6OgzcvPv/U3/Rb8+z/0f/9b/+yfaOn8079X6fr6Cws7ln/iHzNwflPv99/wyS/+xY4+v/evcJ+733+jJ5//Cw7/4ndy9Im3+U2e/Fbnrk31C93vrt/fyPvdb+N//hsF7/4/AQAA//9NLZZ8WAIAAA==" },
{ "/intelcpu/0/load/0/values", "H4sIAAAAAAAEAOy9B2AcSZYlJi9tynt/SvVK1+B0oQiAYBMk2JBAEOzBiM3mkuwdaUcjKasqgcplVmVdZhZAzO2dvPfee++999577733ujudTif33/8/XGZkAWz2zkrayZ4hgKrIHz9+fB8/Iu6//MH37x79i9++mpwcv/md/9df89egZ/xX/ym/5y/4D37618Lv7ya//u+58+u+5d9/z7/5t/w9/6u5fP5bH/6av+eTkXyefXxp26ONaf/v/dG/sf39D/rvnv4e5vc/0IP56/waK/vuHzf5I38P8/tv+mv8Rbb9f0pwTF9/zr/1X9vP/8I//+/6Pf7Z30N+/zdf/HX29zd/859q4aCNP5b//U+U3/+7f+zXOjZwfqvDX/V7/o9/vPz+a1G/pv0f+fGlhfk7eZ//N3/0v28//5X0u/n8Cxq7+f1X/tHft20A5x8a/W5/02+BP36Nf+j/nv8XfzrT+c2//Ob4p3+vktvUhNs/+xcWikP6e/4T/5jS5M8/sL8vP/5ff49f/Ivl9//sHzv6PX/vXyG//9R/94/9HuZ34P/5vyC//3W/5e/1exa/k+Bw4bUBnU2bP4Xg/1bn0uafeTH6PatfKL//N3/0t2y/gG9+/8+IzqYNxmU+/+jwX7afY67/nwAAAP//GYSA31gCAAA=" },
});
myComputer = new Computer(settings) { CPUEnabled = true };
myComputer.Open();
}
void timer_Tick(object sender, EventArgs e)
{
Trace.WriteLine("");
foreach (var hardwareItem in myComputer.Hardware)
{
if (hardwareItem.HardwareType == HardwareType.CPU)
{
hardwareItem.Update();
foreach (IHardware subHardware in hardwareItem.SubHardware)
subHardware.Update();
foreach (var sensor in hardwareItem.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
Trace.WriteLine(String.Format("{0} Temperature = {1}", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value"));
}
}
}
}
}
}
}
Sie sind Götter Geschenk an Programmierer Sir ... –
Wären Sie bereit, irgendwelche Tipps geben, wie man eine ausländische Bibliothek herausfinden? Irgendwelche handlichen Werkzeuge von Drittanbietern? Aber für Ihre Zeit denke ich, dass dieser Beitrag für viele Leute von Interesse sein wird. –
@JoshElias Nur den Quellcode lesen, es ist Open Source: http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver