0

これはコードです:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            while (true)
            {

                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
                    {
                        soundPlay = true;
                        blinking_label();
                        NudgeMe();
                    }
                    else
                    {
                        soundPlay = false;
                        stop_alarm = true;

                    }
                    backgroundWorker1.ReportProgress(
                }
            }
        }

ここに何を配置または使用する必要がありますか: backgroundWorker1.ReportProgress(プログレスバーなどはありません。どうすればよいですか?

それ以前の DoWork イベントは次のようなものでした。

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            while (true)
            {

                if ((worker.CancellationPending == true))
                {
                    e.Cancel = true;
                    break;
                }
                else
                {
                    if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
                    {
                        soundPlay = true;
                        blinking_label();
                        NudgeMe();
                    }
                    else
                    {
                        soundPlay = false;
                        stop_alarm = true;

                    }
                    cpuView();
                    gpuView();
                    //Thread.Sleep(1000);
                }
            }
        }

cpuView() 内の場所:

this.Invoke(new Action(() =>
                                {
                                    data = new List<string>();
                                    data.Add("Gpu Temeprature --- " + sensor.Value.ToString());
                                    listBox1.DataSource = null;
                                    listBox1.DataSource = data;
                                    listBox1.Invalidate();
                                }));

したがって、適切な方法は進捗レポートを使用し、進捗レポートイベントでこの listBox updates を使用することだと思いました。DoWork イベントで cpuView と gpuView を呼び出す代わりに。

4

1 に答える 1

2
    blinking_label();

バックグラウンド ワーカーからラベルを点滅させることはできません。したがって、 ReportProgress() を使用して、ラベルを点滅させるコードを実行することをお勧めします。このメソッドは、進行状況を報告するのに役立つだけでなく、UI スレッドでコードを実行する汎用機能を備えています。

たとえば、しばらく寝ているなど、何度もまばたきや微調整を避けるために何かをする必要があります. その Sleep() 呼び出しをコメントアウトしたままにしておくわけにはいきません。このコードは、ワーカーではなく、Timer の Elapsed イベント ハンドラーの有力候補です。これにより、このコードをより効率的に実行するために使用されるスレッドプール スレッドを確実に使用できるようになります。次に、Control.BeginInvoke() を使用して、UI スレッドでコードを実行します。

さらに、CPU 温度の取得は非常に安価なはずなので、ほとんどの場合、スレッドプール スレッドはまったく必要ありません。これにより、通常の winforms タイマーを使用できるようになり、すべてがシンプルになりました。

于 2013-03-07T22:58:06.703 に答える