2

私は毎秒タイマーでメソッドを呼び出すメソッドにこのコードを持っています:

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

まず、listBox の値を 1 秒ごとに項目として更新します。今、私は2行目に新しいアイテムを追加したいので、両方が毎秒更新されるので、タイマーイベントでは、このコードが内部にある別のメソッドを呼び出しています:

// data = new List<string>();
data.Add("Cpu Temeprature --- " + sensor.Value.ToString());
listBox1.DataSource = null;
listBox1.DataSource = data;
listBox1.Invalidate();

データを使用する場合 = new List(); 2 番目の方法では、両方の項目を listBox の同じ場所に配置します。このデータを使用していない場合 = new List(); 次に、2番目のものが常に点滅し、毎秒点滅し、見栄えがよくありません。

これはタイマー イベントです。

private void timer2_Tick(object sender, EventArgs e)
{
    if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
    {
        soundPlay = true;
        blinking_label();
        NudgeMe();
    }
    else
    {
        soundPlay = false;
        stop_alarm = true;

    }
    cpuView();
    gpuView();
}   

cpuView() と gpuView() は、listBox を更新するタイマーで呼び出している 2 つのメソッドです。

そして、他に 2 つの listBox イベントがあります。

private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
    e.ItemHeight = 25;
}    


private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index == -1)
    {
    }
    else
    {
        ColorText.ColorListBox(data, e);
    }
}

ColorText は、リストボックス内のアイテムをクローリングする新しいクラスにあります。

4

1 に答える 1

2

この方法を続けたい場合は、次の操作を実行できます。

次のように、データの初期化、データソース、および無効化をこれらの関数ブロックの外に移動してみてください。

private void timer2_Tick(object sender, EventArgs e)
        {
            if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
            {
                soundPlay = true;
                blinking_label();
                NudgeMe();
            }
            else
            {
                soundPlay = false;
                stop_alarm = true;

            }
            data = new List<string>();
            cpuView();
            gpuView();
            listBox1.DataSource = data;
            listBox1.Invalidate();
        } 

そして、それらを関数から削除して、2回やり続けないようにします。


これはおそらく、BindingList を使用してより効率的に行うことができます。データを次のように変更します。BindingList Data = new BindingList();

その後、新しいリストを作成する必要はありません。必要な 2 つの値をこの bindinglist に追加してから、listbox.DataSource = the bindinglist を設定します。次に、GPU/CPU 関数で、リスト IE のインデックスを更新するだけです。

data[0] = "CPU 温度 --- " + sensor.Value.ToString());

また、bindinglist はリストボックスの更新を処理する必要があります。

于 2013-03-08T07:07:27.143 に答える