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 に答える