0

今のところ、一度温度を表示しています。openhardwaremonitorの元のプログラムのように、毎秒温度が変化/更新されるように、または温度に変化があるかどうかに応じて、そこでどのように機能するかわからないように機能させたいです。

私がしたことは、コンストラクターからすべてのforeachループを取り出し、それをタイマーティックイベントに入れることです。しかし、それはうまくいきません。openhardwaremonitorでは、表示が51cに変更されましたが、私のアプリケーションでは、アプリケーションを初めて実行したときと同じように、常に44cで表示されていました。

textBox行にブレークポイントを使用し、そこに到達することで内部ループを実行することもありますが、dosentはifとdosentがメッセージボックスに到達し、メッセージボックスに到達する場合は44cを表示します。

コード:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Management;
using OpenHardwareMonitor.Hardware;

namespace NvidiaTemp
{
    public partial class Form1 : Form
    {
        Computer computer = new Computer();
        public Form1()
        {
            InitializeComponent();

            computer.Open();
            computer.GPUEnabled = true;
            timer1.Enabled = true;





        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            foreach (var hardwareItem in computer.Hardware)
            {

                if (hardwareItem.HardwareType == HardwareType.GpuNvidia)
                {
                    foreach (var sensor in hardwareItem.Sensors)
                    {
                        if (sensor.SensorType == SensorType.Temperature)
                        {
                            //   MessageBox.Show(String.Format("The current temperature is {0}", sensor.Value));
                            textBox1.Text = String.Format("The current temperature is {0}", sensor.Value);
                        }
                    }
                }

            }
        }
    }
}
  1. ループを実行するたびにtextBox行に到達するように更新しないのはなぜですか?

  2. openhardwaremonitorの元のプログラムで温度値に変更があったり、タイマーで動作したりした場合、温度を更新しますか?

4

2 に答える 2

2

私は実際にあなたの以前の質問にこれに対する部分的な答えを投稿しましたが、参考のためにここに含めてください。

あなたの質問は、実際にはほとんどがWindows.Forms.Timerに関する標準的な質問です(または、InvokeRequiredをチェックするという通常の警告とともに、BackgroundWorkerまたは選択した他のタイマーを使用することもできます)

とにかく、以下はあなたのために働くはずの何かの短い例です:

    Timer timer;

    Computer myComputer;

    ISensor GPUTemperatureSensor;

    public Form1()
    {

        InitializeComponent();

        myComputer = new Computer();

        myComputer.Open();

        myComputer.GPUEnabled = true;

        foreach (var hardwareItem in myComputer.Hardware)
        {

            if (hardwareItem.HardwareType == HardwareType.GpuNvidia)
            {
                foreach (var sensor in hardwareItem.Sensors)
                {
                    if (sensor.SensorType == SensorType.Temperature)
                    {
                        GPUTemperatureSensor = sensor;

                    }
                }
            }

        }

        timer = new Timer();
        timer.Interval = 5000;
        timer.Tick += new EventHandler(timer_Tick);
        timer.Start();

     }

    void timer_Tick(object sender, EventArgs e)
    {
        if(GPUTemperatureSensor != null)
        {
            GPUTemperatureSensor.Hardware.Update();//This line refreshes the sensor values
            textBox1.Text = String.Format("The current temperature is {0}", GPUTemperatureSensor.Value);
        }
        else
        {
            textBox1.Text = "Could not find the GPU Temperature Sensor. Stopping.";
            timer.Stop(); 
        }
    }

毎回ハードウェアコレクションを列挙しないように、実際にはセンサーをクラスレベルで保存しました。

ハードウェアのUpdate()メソッドに対する@mikezコメントも含めました-Mikeに感謝します!

于 2012-07-31T22:34:55.407 に答える
0

なぜループでそれをしているのかわかりません。次のティックの前にループが完了していない場合、それらが互いにステップしている可能性があるため、これが問題を引き起こしていると思います。

そのGPUに1つのGPUと1つの温度センサーしかない場合、次のようなことをしてみませんか。

var hardwareItem = computer.Hardware.Single(h => h.HardwareType == HardwareType.GpuNvidia)
var sensor = hardwareItem.Sensors.Single(s => s.SensorType == SensorType.Temperature)
//   MessageBox.Show(String.Format("The current temperature is {0}", sensor.Value));
textBox1.Text = String.Format("The current temperature is {0}", sensor.Value);

不要なループを完全に削除し、そのメソッドを高速に実行する必要があります。

于 2012-07-31T22:36:27.547 に答える