特定のプロセスの CPU 使用率を取得する方法を見つけようとしていますが、全体的なCPU 使用率に関する情報しか見つかりません。
特定のアプリケーションの現在の CPU 使用率をパーセンテージで抽出する方法を知っている人はいますか?
パフォーマンス カウンター - プロセス - % プロセッサ時間。
アイデアを提供するための小さなサンプルコード:
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);
}
}
}
}
Process ID に基づいてインスタンスを見つけるための注意事項:
私はこれ以上良い方法を知りません。そうでない場合は、プロセス ID とプロセス名からプロセスの正しいインスタンス名を見つける方法の 1 つを次に示します。
ファミリ"ID Process"
の下に呼び出される別のパフォーマンス カウンター (PC) があります。"Process"
インスタンスの PID を返します。そのため、名前 (「chrome」または「myapp」など) が既にわかっている場合は、一致する PID が見つかるまで各インスタンスをテストできます。
各インスタンスの命名は単純です: 「myapp」「myapp#1」「myapp#2」...など。
... new PerformanceCounter("Process", "ID Process", appName, true);
PC の値が PID と等しくなると、正しいappName
. appName
その後、それを他のカウンターに使用できます。
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);
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());
}
}