web-dev-qa-db-ja.com

c#は特定のアプリケーションのCPU使用率を計算します

特定のプロセスのCPU使用率を取得する方法を理解しようとしていますが、全体 CPU使用率に関連する情報しか見つけることができません。

特定のアプリケーションの現在のCPU使用率をパーセンテージで表す)を抽出する方法を知っている人はいますか?

22
Grant

パフォーマンスカウンター-プロセス-%プロセッサー時間。

あなたにアイデアを与えるための小さなサンプルコード:

using System;
using System.Diagnostics;
using System.Threading;

namespace StackOverflow
{
    class Program
    {
        static void Main(string[] args)
        {
            PerformanceCounter myAppCpu = 
                new PerformanceCounter(
                    "Process", "% Processor Time", "Outlook", true);

            Console.WriteLine("Press the any key to stop...\n");
            while (!Console.KeyAvailable)
            {
                double pct = myAppCpu.NextValue();
                Console.WriteLine("Outlook'S CPU % = " + pct);
                Thread.Sleep(250);
            }
        }
    }
}

プロセスIDに基づいてインスタンスを検索する場合の注意

私はこれ以上の方法を知りません、そしてうまくいけば誰かがそうします。そうでない場合は、プロセスIDとプロセス名を指定してプロセスに適切なインスタンス名を見つける1つの方法があります。

"ID Process"ファミリの下には、"Process"と呼ばれる別のパフォーマンスカウンタ(PC)があります。インスタンスのPIDを返します。したがって、名前(つまり、「chrome」または「myapp」)がすでにわかっている場合は、PIDに一致するものが見つかるまで、各インスタンスをテストできます。

インスタンスごとの命名は単純です: "myapp" "myapp#1" "myapp#2" ...など。

...  new PerformanceCounter("Process", "ID Process", appName, true);

PCの値がPIDと等しくなると、正しいappNameが見つかります。その後、そのappNameを他のカウンターに使用できます。

35
Erich Mirabal

PerformanceCounterを使用せずに単一プロセスのプロセッサ使用量を計算する方法。

using System;
using System.Diagnostics;

namespace cpuusage
{
    class Program
    {
        private static DateTime lastTime;
        private static TimeSpan lastTotalProcessorTime;
        private static DateTime curTime;
        private static TimeSpan curTotalProcessorTime;

        static void Main(string[] args)
        {
            string processName = "Outlook";

            Console.WriteLine("Press the any key to stop...\n");
            while (!Console.KeyAvailable)
            {
                Process[] pp = Process.GetProcessesByName(processName);
                if (pp.Length == 0)
                {
                    Console.WriteLine(processName + " does not exist");
                }
                else
                {
                    Process p = pp[0];
                    if (lastTime == null || lastTime == new DateTime())
                    {
                        lastTime = DateTime.Now;
                        lastTotalProcessorTime = p.TotalProcessorTime;
                    }
                    else
                    {
                        curTime = DateTime.Now;
                        curTotalProcessorTime = p.TotalProcessorTime;

                        double CPUUsage = (curTotalProcessorTime.TotalMilliseconds - lastTotalProcessorTime.TotalMilliseconds) / curTime.Subtract(lastTime).TotalMilliseconds / Convert.ToDouble(Environment.ProcessorCount);
                        Console.WriteLine("{0} CPU: {1:0.0}%",processName,CPUUsage * 100);

                        lastTime = curTime;
                        lastTotalProcessorTime = curTotalProcessorTime;
                    }
                }

                Thread.Sleep(250);
            }
        }
    }
}

プロセスをループしてどれを選択するか、またはIDがすでにわかっている場合は、GetProcessesByName()の代わりにこのコマンドを使用するだけです。

Process p = Process.GetProcessById(123);
8
rayzinnz

私はいくつかの回答(最も顕著に これ )から情報をコンパイルし、現在のプロセスのCPUとRAMパフォーマンスに基づく使用量に関する情報を取得できる次のコードを考え出しますWindowsが提供するカウンター情報:

public object GetUsage()
{
    // Getting information about current process
    var process = Process.GetCurrentProcess();

    // Preparing variable for application instance name
    var name = string.Empty;

    foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames())
    {
        if (instance.StartsWith(process.ProcessName))
        {
            using (var processId = new PerformanceCounter("Process", "ID Process", instance, true))
            {
                if (process.Id == (int)processId.RawValue)
                {
                    name = instance;
                    break;
                }
            }
        }
    }

    var cpu = new PerformanceCounter("Process", "% Processor Time", name, true);
    var ram = new PerformanceCounter("Process", "Private Bytes", name, true);

    // Getting first initial values
    cpu.NextValue();
    ram.NextValue();

    // Creating delay to get correct values of CPU usage during next query
    Thread.Sleep(500);

    dynamic result = new ExpandoObject();

    // If system has multiple cores, that should be taken into account
    result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2);
    // Returns number of MB consumed by application
    result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2);

    return result;
}

インスタンス名はハッキングや推測なしで決定され、複数のコアにも注意を払っています。

取得した情報は、プロセスエクスプローラーやVSのパフォーマンスウィンドウに表示される情報と一致しています。

4
shytikov
PerformanceCounter ProcessCPUCounter = new PerformanceCounter();
            ProcessCPUCounter.CategoryName = "Process";
            ProcessCPUCounter.CounterName = "% Processor Time";
            ProcessCPUCounter.InstanceName = "TestServiceName"; 
            ProcessCPUCounter.ReadOnly = true;

t3 = new Timer();
            t3.Tick += new EventHandler(ProcessCPUThread); // Everytime t3 ticks, th2_Tick will be called
            t3.Interval = (1000) * (1);              // Timer will tick evert second
            t3.Enabled = true;                       // Enable the t3
            t3.Start(); 

private void ProcessCPUThread(object sender, EventArgs e)
        {
            try
            {         
                Int32 processCPU = Convert.ToInt32( ProcessCPUCounter.NextValue());

                tbCPUperPrcocess.Text = Convert.ToString(processCPU / Environment.ProcessorCount);
            }
            catch (Exception ex)
            {

                MessageBox.Show(ex.Message.ToString());
            }
        }
0