如何在c#中的同一个tick事件中放入两个进度条

时间:2015-07-13 18:52:28

标签: c# winforms progress-bar cpu-usage

我在同一个tick事件中放置两个进度条时遇到了一些麻烦。第二个进度条加载到0%或100%,并且这两个值之间没有任何内容。这是我到目前为止的代码。

        void timeElapsed(object sender, EventArgs e)
    {
        progressBar1.Value = (int)(power.BatteryLifePercent * 100);
        label1.Text = string.Format("{0}%", (power.BatteryLifePercent * 100));

        cpuCounter.CategoryName = "Processor";
        cpuCounter.CounterName = "% Processor Time";
        cpuCounter.InstanceName = "_Total";

        var unused = cpuCounter.NextValue();

        progressBar2.Value = (int)(cpuCounter.NextValue());
        label2.Text = "CPU  " + progressBar2.Value.ToString() + "%";
    }

第一个进度条加载正常且电池百分比正确,但第二个进度条始终为100%或0%。

1 个答案:

答案 0 :(得分:0)

你不应该连续两次读取计数器而不等待至少1秒钟。如果您在方法中删除了对cpuCounter.NextValue()的第一次调用,则一切都应该开始正常工作,否则第二次调用总是返回0或100,正如我的测试显示的那样。据我所知,你不会在任何地方使用这个价值。

像这样改变你的方法,它应该有效:

void timeElapsed(object sender, EventArgs e)
{
    progressBar1.Value = (int)(power.BatteryLifePercent * 100);
    label1.Text = string.Format("{0}%", (power.BatteryLifePercent * 100));

    cpuCounter.CategoryName = "Processor";
    cpuCounter.CounterName = "% Processor Time";
    cpuCounter.InstanceName = "_Total";

    //var unused = cpuCounter.NextValue();

    progressBar2.Value = (int)(cpuCounter.NextValue());
    label2.Text = "CPU  " + progressBar2.Value.ToString() + "%";
}

我从MSDN documentation得到了我的信息:

  

如果计数器的计算值取决于两个计数器读数,则   第一次读取操作返回0.0。重置性能计数器   指定不同计数器的属性相当于创建一个   新的性能计数器,以及使用新的第一个读取操作   属性返回0.0。呼叫之间建议的延迟时间   NextValue方法是一秒钟,以允许计数器执行   下一次增量阅读。

如前所述,第一个电话仍会返回0。