2

問題は、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 に接続しています。

4

2 に答える 2

0

バックグラウンドワーカーを使用すると、簡単な方法でマルチスレッドを実行できます。あなたのケースで役に立ち、非同期で doWork メソッドを呼び出します。このメソッドでは、ループで 2 つの関数を呼び出します。ここで msdn の説明http://msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx 関数を完了させる必要があるため、ランダムな間隔値を設定するタイマーよりも優れていますそのため、イベントが発生する必要がある場合、それは発生しません....

于 2012-08-04T01:27:35.923 に答える