C# + WinAPI. Получение значений счетчиков производительности
Формулировка задачи:
Здравствуйте!
Поставлено задание отображать на C# с помощью функций WinAPI(в крайнем случае PDH) основные показатели загруженности компьютера: % загрузки ЦП, памяти, жесткого диска(чтение / запись) и сети(чтение / запись), по аналогии с вкладкой "Производительность" в диспетчере задач.
Использовать библиотеку System.Diagnostics.PerformanceCounter из .NET нельзя
Для решения поставленной задачи использую библиотеку kernel32.dll, и на данный момент получилось достать загрузку ЦП(общую, для каждого ядра - свой показатель еще не сделал) и количество доступной/общей памяти.
Вот код:
Перегуглил весь инет и застопорился на остальных пунктах: уровень загрузки ЖД и Сети.
Буду рад помощи в любой форме, конечно желательно код
Спасибо!
PS: Возможно кто-то знает как с помощью Performance Data Helper (PDH) + C# достать значения счетчиков производительности(http://technet.microsoft.com/en-us/library/cc768048.aspx)?
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
public class MEMORYSTATUSEX
{
public uint dwLength = (uint)System.Runtime.InteropServices.Marshal.SizeOf(typeof(MEMORYSTATUSEX));
public uint dwMemoryLoad;
public ulong ullTotalPhys;
public ulong ullAvailPhys;
public ulong ullTotalPageFile;
public ulong ullAvailPageFile;
public ulong ullTotalVirtual;
public ulong ullAvailVirtual;
public ulong ullAvailExtendedVirtual;
/*
DWORD dwLength; // Размер структуры
DWORD dwMemoryLoad; // Процент использования памяти
DWORD dwTotalPhys; // Физическая память, байт
DWORD dwAvailPhys; // Свободная физическая память, байт
DWORD dwTotalPageFile; // Размер файла подкачки, байт
DWORD dwAvailPageFile; // Свободных байт в файле подкачки
DWORD dwTotalVirtual; // Виртуальная память, используемая процессом
DWORD dwAvailVirtual; // Свободная виртуальная память
*/
}
[System.Runtime.InteropServices.DllImport("kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern bool GlobalMemoryStatusEx(MEMORYSTATUSEX lpBuffer);
[System.Runtime.InteropServices.DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetSystemTimes(
out double lpIdleTime,
out double lpKernelTime,
out double lpUserTime
);
private double idleTimeOld, kernelTimeOld, userTimeOld;
string GetIdleTime()
{
double idleTime, kernelTime, userTime;
GetSystemTimes(out idleTime, out kernelTime, out userTime);
double usr = userTime - userTimeOld
, ker = kernelTime - kernelTimeOld
, idl = idleTime - idleTimeOld;
double sys = ker + usr;
string result = ((int)((sys - idl) / sys * 100)).ToString();
idleTimeOld = idleTime;
kernelTimeOld = kernelTime;
userTimeOld = userTime;
return result;
}
private void timer1_Tick(object sender, EventArgs e)
{
var result = new MEMORYSTATUSEX();
if (GlobalMemoryStatusEx(result))
getpercentage(((double)result.ullTotalPhys - result.ullAvailPhys) / result.ullTotalPhys);
//Память
label2.Text = "ullTotalPhys= " + result.ullTotalPhys / 1024 / 1024 +
"\nullAvailPhys= " + result.ullAvailPhys / 1024 / 1024 +
"\nullTotalVirtual= " + result.ullTotalVirtual / 1024 / 1024 +
"\nullAvailVirtual= " + result.ullAvailVirtual / 1024 / 1024;
string tempCPURes = GetIdleTime() + "%";//Уровень загрузки ЦП
}
PSS: Возможно у кого-то завалялся диспетчер задач(просмотр/убивание процессов) на C# + WinAPI, поделитесь пожалуйста.
Решение задачи: «C# + WinAPI. Получение значений счетчиков производительности»
textual
Листинг программы
using System;
using System.Runtime.InteropServices;
using System.Security;
namespace ConsoleApplication39
{
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public class MemoryStatus
{
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern bool GlobalMemoryStatusEx([In, Out] MemoryStatus lpBuffer);
private uint dwLength;
public uint MemoryLoad;
public ulong TotalPhys;
public ulong AvailPhys;
public ulong TotalPageFile;
public ulong AvailPageFile;
public ulong TotalVirtual;
public ulong AvailVirtual;
public ulong AvailExtendedVirtual;
private static volatile MemoryStatus singleton;
private static readonly object syncroot = new object();
public static MemoryStatus CreateInstance()
{
if (singleton == null)
lock (syncroot)
if (singleton == null)
singleton = new MemoryStatus();
return singleton;
}
[SecurityCritical]
private MemoryStatus()
{
dwLength = (uint) Marshal.SizeOf(typeof (MemoryStatus));
GlobalMemoryStatusEx(this);
}
}
class Program
{
static void Main()
{
MemoryStatus status = MemoryStatus.CreateInstance();
ulong ram = status.TotalPhys;
Console.WriteLine("RAM = {0} MB", ram/1024/1024);
Console.ReadKey();
}
}
}