Poniżej znajduje się tak daleko, jak mam. Nie mam na to więcej czasu, więc zostawię resztę tego tropienia.
Nie mogłem znaleźć żadnej dokumentacji. W kodzie nie ma nawet komentarzy XML, więc przeszukałem kod źródłowy, aby dostać się tak daleko jak ja. Będziesz musiał zrobić to samo.
Przede wszystkim musisz ustawić właściwość Computer.CPUEnabled
na wartość true, zanim zadzwonisz pod numer Computer.Open
. To powoduje, że Open dodaje urządzenie sprzętowe CPU.
Drugą rzeczą, której brakuje, jest to, że musisz zadzwonić pod numer Computer.Open
.
Trzecią rzeczą, której ci brakuje, jest to, że musisz zadzwonić pod numer Hardware.Update
, aby zmusić go do ponownej odpytywania sprzętu.
Czwartą rzeczą, której brakuje, jest to, że wartość czujnika to Nullable<float>
. Musisz sprawdzić, czy istnieje tam poprawna wartość.
To wciąż nie wystarczy. Chociaż teraz wyprowadza cztery czujniki temperatury (na mojej maszynie), nigdy nie ma wartości temperatury.
Przeszukałem ustawienia i odkryłem, że istnieją te długie pozycje inicjalizacyjne dla temperatury procesora i procesora. Dodałem kod, aby umieścić te ustawienia w Computer
(przynajmniej dla jednego z rdzeni), ale nie przyniosło to żadnego efektu.
Co się niepowodzeniem jest to wezwanie w IntelCpu.Update
Ring0.RdmsrTx(IA32_THERM_STATUS_MSR, out eax, out edx, 1UL << cpuid[i][0].Thread)
Dlatego podejrzewam, że istnieje jakiś inicjalizacji brakuje.
Powodzenia!
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"));
}
}
}
}
}
}
}
Jesteś bogiem darem dla programistów, proszę pana ... –
Czy byłbyś gotów udzielić wskazówek, jak znaleźć zagraniczną bibliotekę? Wszelkie przydatne narzędzia innych firm? Ale za Twój czas, myślę, że ten post będzie interesujący dla wielu osób. –
@JoshElias Wystarczy przeczytać kod źródłowy, jest to open source: http://code.google.com/p/open-hardware-monitor/source/browse/#svn/trunk – Tergiver