問題は、foreach ループが多すぎることだと思います。しかし、センサーを取得するにはそれらが必要です.Value
これは次の 2 つの関数です。
private void cpuView()
{
Computer myComputer = new Computer();
myComputer = new Computer(settings) { CPUEnabled = true };
myComputer.Open();
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)
{
settings.SetValue("sensor", sensor.Value.ToString());
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
settings.GetValue("sensor", sensor.Value.ToString());
temperature_label.Text = sensor.Value.ToString() + "c";//String.Format("{0} Temperature = {1}c", sensor.Name, sensor.Value.HasValue ? sensor.Value.Value.ToString() : "no value");
}
}
}
}
}
そして2番目の機能:
private void gpuView()
{
Computer computer = new Computer();
computer.Open();
computer.GPUEnabled = true;
foreach (var hardwareItem in computer.Hardware)
{
if (videoCardType("ati", "nvidia") == true)
{
HardwareType htype = HardwareType.GpuNvidia;
if (hardwareItem.HardwareType == htype)
{
foreach (var sensor in hardwareItem.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
if (sensor.Value.ToString().Length > 0)
{
if (newGPULabel.Text.Length < 1)
{
if (UpdatingLabel(sensor.Value.ToString(), string.Empty))
{
label8.Text = newGPULabel.Text;
}
}
else if (UpdatingLabel(sensor.Value.ToString(), newGPULabel.Text.Substring(0, newGPULabel.Text.Length - 1)))
{
label8.Text = newGPULabel.Text;
}
newGPULabel.Text = sensor.Value.ToString() + "c";
label8.Visible = true;
}
int t = newGPULabel.Text.Length;
if (t >= 4)
{
newGPULabel.Location = new Point(210, 100);
}
else
{
newGPULabel.Location = new Point(250, 100);
}
timer2.Interval = 1000;
if (sensor.Value > 90)
{
Logger.Write("The current temperature is ===> " + sensor.Value);
button1.Enabled = true;
}
this.Select();
}
}
}
}
else
{
HardwareType htype = HardwareType.GpuAti;
if (hardwareItem.HardwareType == htype)
{
foreach (var sensor in hardwareItem.Sensors)
{
if (sensor.SensorType == SensorType.Temperature)
{
sensor.Hardware.Update();
if (sensor.Value.ToString().Length > 0)
{
if (newGPULabel.Text.Length < 1)
{
if (UpdatingLabel(sensor.Value.ToString(), string.Empty))
{
label8.Text = newGPULabel.Text;
}
}
else if (UpdatingLabel(sensor.Value.ToString(), newGPULabel.Text.Substring(0, newGPULabel.Text.Length - 1)))
{
label8.Text = newGPULabel.Text;
}
newGPULabel.Text = sensor.Value.ToString() + "c";
label8.Visible = true;
}
int t = newGPULabel.Text.Length;
if (t >= 4)
{
newGPULabel.Location = new Point(210, 100);
}
else
{
newGPULabel.Location = new Point(250, 100);
}
timer2.Interval = 1000;
if (sensor.Value > 90)
{
Logger.Write("The current temperature is ===> " + sensor.Value);
button1.Enabled = true;
}
this.Select();
}
}
}
}
}
}
そして、timer2 tick イベントでは:
private void timer2_Tick(object sender, EventArgs e)
{
gpuView();
cpuView();
}
tickイベントでこの関数を呼び出さないと、プログラムはスムーズに実行されますが、関数の1つだけを呼び出しても、n秒ごとにスタックします。
CPUとGPUの温度を更新しているので、timer2は間隔100に設定されています。それらをすばやく更新したいのです。問題が関数内の foreach ループが多すぎることなのか、それとも間隔が 100 であるため、センサーから値を取得しようとするのが速すぎて、ハードウェアが情報をすばやく取得できないのかはわかりません。
foreach ループの一部を削除する方法があるのではないでしょうか? すべての Form1 コードを here にアップロードしたくありません。ただし、すべてのセンサーとハードウェアは、OpenHardwareMonitorApplication の OpenHardwareMonitor.dll に接続しています。