C# + WinAPI. Получение значений счетчиков производительности

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Поставлено задание отображать на C# с помощью функций WinAPI(в крайнем случае PDH) основные показатели загруженности компьютера: % загрузки ЦП, памяти, жесткого диска(чтение / запись) и сети(чтение / запись), по аналогии с вкладкой "Производительность" в диспетчере задач. Использовать библиотеку System.Diagnostics.PerformanceCounter из .NET нельзя Для решения поставленной задачи использую библиотеку kernel32.dll, и на данный момент получилось достать загрузку ЦП(общую, для каждого ядра - свой показатель еще не сделал) и количество доступной/общей памяти. Вот код:
        [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() + "%";//Уровень загрузки ЦП
}
Перегуглил весь инет и застопорился на остальных пунктах: уровень загрузки ЖД и Сети. Буду рад помощи в любой форме, конечно желательно код Спасибо! PS: Возможно кто-то знает как с помощью Performance Data Helper (PDH) + C# достать значения счетчиков производительности(http://technet.microsoft.com/en-us/library/cc768048.aspx)?
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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы