, API:
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetProcessTimes(IntPtr hProcess, out System.Runtime.InteropServices.ComTypes.FILETIME
lpCreationTime, out System.Runtime.InteropServices.ComTypes.FILETIME lpExitTime, out System.Runtime.InteropServices.ComTypes.FILETIME lpKernelTime,
out System.Runtime.InteropServices.ComTypes.FILETIME lpUserTime);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.U4)]
static extern UInt32 GetTickCount();
static bool gbSetOldData = false;
static UInt32 gmsOldTickCount = 0;
static ulong gnsOldKernelTime = 0;
static ulong gnsOldUserTime = 0;
public static double getCPUUsageForProcess(int nProcID = 0)
{
double fCPUUsage = -1.0;
try
{
IntPtr hProcess = nProcID != 0 ? Process.GetProcessById(nProcID).Handle : Process.GetCurrentProcess().Handle;
System.Runtime.InteropServices.ComTypes.FILETIME ftCreated, ftExit, ftKernel, ftUser;
if (GetProcessTimes(hProcess, out ftCreated, out ftExit, out ftKernel, out ftUser))
{
UInt32 dwmsNewTickCount = GetTickCount();
ulong nsNewKernelTime = (ulong)ftKernel.dwHighDateTime;
nsNewKernelTime <<= 32;
nsNewKernelTime |= (ulong)(uint)ftKernel.dwLowDateTime;
ulong nsNewUserTime = (ulong)ftUser.dwHighDateTime;
nsNewUserTime <<= 32;
nsNewUserTime |= (ulong)(uint)ftUser.dwLowDateTime;
if (gbSetOldData)
{
fCPUUsage = (double)((nsNewKernelTime - gnsOldKernelTime) + (nsNewUserTime - gnsOldUserTime)) /
(double)((dwmsNewTickCount - gmsOldTickCount) * 10000);
fCPUUsage /= Environment.ProcessorCount;
if (fCPUUsage > 1.0)
fCPUUsage = 1.0;
}
else
{
fCPUUsage = 0.0;
}
gnsOldKernelTime = nsNewKernelTime;
gnsOldUserTime = nsNewUserTime;
gmsOldTickCount = dwmsNewTickCount;
gbSetOldData = true;
}
}
catch
{
fCPUUsage = -1.0;
}
return fCPUUsage;
}
:
int nDummy = 1;
for (; ; )
{
double fCPU = getCPUUsageForProcess();
Console.CursorTop = 1;
Console.CursorLeft = 0;
int nCpu = (int)(fCPU * 100);
Console.WriteLine("CPU%: {0}\t\t", nCpu);
long j = 0;
for (; j < 1000000; j++)
{
nDummy += (int)Math.Cos(1 / (j + 1));
}
System.Threading.Thread.Sleep(500);
}
, .NET . ( , ), ?