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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д