私はこのコードを持っています:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using DannyGeneral;
namespace CpuUsage
{
public partial class Form1 : Form
{
private List<float> processValues;
private bool alreadyRun;
private DateTime dt;
private DateTime dt1;
private PerformanceCounter theCPUCounter;
private PerformanceCounter theMemCounter;
private PerformanceCounter specProcessCPUCounter;
private float cpuUsage;
private float memUsage;
private List<float> Values;
public Form1()
{
InitializeComponent();
processValues = new List<float>();
alreadyRun = false;
dt = DateTime.Now;
Values = new List<float>();
theCPUCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total");
theMemCounter = new PerformanceCounter("Memory", "Available MBytes");
specProcessCPUCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void timer1_Tick(object sender, EventArgs e)
{
memUsage = theMemCounter.NextValue();
label1.Text = memUsage.ToString();
Logger.Write("Memory Usage " + memUsage.ToString());
cpuUsage = this.theCPUCounter.NextValue();
label2.Text = cpuUsage.ToString();
Logger.Write("Cpu Usage " + this.cpuUsage.ToString());
Values.Add(cpuUsage);
isProcessRunning();
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
dt1 = DateTime.Now;
float Maximum = Values.Max();
float Minimum = Values.Min();
float Average = Values.Average();
string t = string.Format("Maximum --- {0} , Minimum --- {1} , Average --- {2}", Maximum, Minimum, Average);
Logger.Write(t);
TimeSpan ts = (dt1 - dt);
string time = ts.ToString(@"hh\:mm\:ss");
Logger.Write("Time The Program Was Running --- " + time);
}
private void isProcessRunning()
{
Process[] proclist = Process.GetProcessesByName("BFBC2Game");
if (proclist.Length > 0)
{
if (alreadyRun == false)
{
Logger.Write("Bfbc2 Started");
alreadyRun = true;
}
}
else
{
if (alreadyRun == true)
{
Logger.Write("Bfbc2 Exited");
alreadyRun = false;
}
}
}
}
}
新しい List : processValues を追加しました。私がやりたかったのは、たとえばこの場合にプロセスを終了したときです: BFBC2Game プロセスが開始されてから終了するまで、Max() Min() と Average() がロガーに書き込まれます。
問題は、プログラムが数分間実行され、すでにいくつかの情報が記録された後にプロセスが開始される可能性があることです。プロセスの開始時と終了時の間のみ、最大最小値と平均値を取得したいと考えています。
したがって、フォームを閉じると、プログラムはロガーテキストファイルでプログラムを終了し、最後に次のように表示されます。
8/31/2012--12:18 AM ==> Maximum --- 42.05113 , Minimum --- 0 , Average --- 13.19243
8/31/2012--12:18 AM ==> Time The Program Was Running --- 00:00:49
そして、プロセスがいつ開始されて終了したかがわかる真ん中のどこかで:
8/31/2012--12:17 AM ==> Memory Usage 4435
8/31/2012--12:17 AM ==> Cpu Usage 5.57648
8/31/2012--12:17 AM ==> Bfbc2 Started
8/31/2012--12:17 AM ==> Memory Usage 4412
8/31/2012--12:17 AM ==> Cpu Usage 15.38422
8/31/2012--12:17 AM ==> Bfbc2 Exited
8/31/2012--12:18 AM ==> Memory Usage 4432
8/31/2012--12:18 AM ==> Cpu Usage 13.26883
アプリケーションを終了すると、ファイルの最後に次のようなメッセージが表示されるようになりました。
8/31/2012--12:18 AM ==> Bfbc2 Started at 8/31/2012--12:17 AM
8/31/2012--12:19 AM ==> Maximum --- 42.05113 , Minimum --- 0 , Average --- 13.19243
8/31/2012--12:19 AM ==> Bfbc2 Exited at 8/31/2012--12:17 AM
したがって、プロセスが開始されて終了したときにファイルの最後を調べることと、プロセスが実行されていた時間の最小値と平均値が混在していることがわかります。