2

我正在制作一个测试 WinForm 应用程序,以尝试和监视具有相同名称的进程。但由于某种原因它不起作用。

但是我表格上的标签保持为零。

表单的全局变量:

Thread checkProcess;
List<PerformanceCounter> pcs;

单击按钮开始监控过程

private void btnMonitor_Click(object sender, EventArgs e)
{
    List<Process> proc = new List<Process>();
    foreach (Process p in Process.GetProcesses())
    {
        if (p.ProcessName.IndexOf(txtProcessName.Text) > -1)
        {
            proc.Add(p);
        }
    }
    pcs = new List<PerformanceCounter>();
    int k = 0;
    foreach (Process p in proc)
    {
        pcs.Add(new PerformanceCounter("Process", "% Processor Time", k > 0 ?
            string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName, true));
        lstbxPC.Items.Add(k > 0 ?
            string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
        k++;
    }
    checkProcess = new Thread(CheckProcess);
    checkProcess.Start();
}

监视和更新标签的方法(在它自己的线程中开始):

private void CheckProcess()
{
    int temp = 0;
    while (true)
    {
        temp = 0;
        foreach (PerformanceCounter pc in pcs)
        {
            if (temp < pc.NextValue())
            {
                temp = (int)pc.NextValue();
            }

        }
        // Set the label in a ThreadSafe way. This does work
        SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
        Thread.Sleep(1000);
    }
}
4

2 回答 2

1

有很多事情要检查:

  • pcs有物品吗?(调试)
  • 里面的文字是txtProcessName什么?(模式是{process name without exe}#{nb},如 devenv#1,devenv#2,...}
  • 你能读懂性能计数器吗?(检查安全)
  • 因为您将 NextValue() 转换为 int,所以您不会看到任何 < 1% 的变化

您还应该更改代码,因为如果进程停止,您将收到异常(计数器类别中缺少实例)。

于 2012-10-01T14:52:48.947 回答
1

试穿这个尺寸:

    private void btnMonitor_Click(object sender, EventArgs e)
    {
        var proc = Process.GetProcesses().Where(p => p.ProcessName.IndexOf(this.txtProcessName.Text) > -1);
        var k = 1;
        var appendSuffix = proc.Count() > 1;

        this.pcs = new List<PerformanceCounter>();
        foreach (var p in proc)
        {
            this.pcs.Add(new PerformanceCounter(
                "Process",
                "% Processor Time",
                appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName,
                true));
            this.lstbxPC.Items.Add(appendSuffix ? string.Format("{0}#{1}", p.ProcessName, k) : p.ProcessName);
            k++;
        }

        this.checkProcess = new Thread(this.CheckProcess);
        this.checkProcess.Start();
    }

    private void CheckProcess()
    {
        while (true)
        {
            var temp = 0;

            foreach (var pc in this.pcs)
            {
                var nextValue = pc.NextValue();

                if (temp < nextValue)
                {
                    temp = (int)nextValue;
                }
            }

            // Set the label in a ThreadSafe way. This does work.
            SetControlPropertyThreadSafe(lblCPU, "Text", Convert.ToString(temp) + "%");
            Thread.Sleep(1000);
        }
    }
于 2012-10-01T16:08:29.643 回答