На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Загруженность процессора для процесса C#


Был тут недавно небольшой заказ: необходимо получить загруженность процессора и памяти для каждого процесса на C#. По сути дела аналог диспетчера задач, встроенного в Windows. Задача оказалась простой, но с небольшой хитростью. Итак, давайте научимся получать данные о процессе на C# с помощью NET.

Выглядит все проще некуда. Берем класс PerformanceCounter и читаем описание:

Компонент PerformanceCounter может использоваться как для чтения существующих предопределенных или пользовательских счетчиков, так и для публикации (записи) данных производительности в пользовательские счетчики.

Этот тип реализует интерфейс IDisposable. Когда вы закончите использовать тип, вы должны избавиться от него прямо или косвенно. Чтобы избавиться от типа напрямую, вызовите его метод Dispose в блоке try/catch. Чтобы избавиться от него косвенно, используйте языковую конструкцию, такую как using (в C#) или Using (в Visual Basic).

Счетчик (PerformanceCounter) - это механизм сбора данных о производительности. В реестре хранятся имена всех счетчиков, каждый из которых относится к определенной области функциональности системы. Примеры включают время занятости процессора, использование памяти или количество байтов, полученных через сетевое подключение.

Каждый счетчик однозначно идентифицируется по его имени и местоположению. Таким же образом, как путь к файлу включает диск, каталог, один или несколько подкаталогов и имя файла, информация о счетчике состоит из четырех элементов: компьютер, категория, экземпляр категории и имя счетчика.

Информация счетчика должна включать категорию или объект производительности, для которых счетчик измеряет данные. Категории компьютера включают физические компоненты, такие как процессоры, диски и память. Существуют также системные категории, такие, как процессы и потоки. Каждая категория связана с функциональным элементом внутри компьютера и имеет набор стандартных счетчиков, назначенных ему. Эти объекты перечислены в раскрывающемся списке объект производительности диалогового окна добавление счетчиков в системном мониторе Windows 2000, и их необходимо включить в путь счетчика. Данные о производительности группируются по категориям, к которым они относятся.

В некоторых случаях может существовать несколько копий одной и той же категории. Например, несколько процессов и потоков выполняются одновременно, а некоторые компьютеры содержат более одного процессора. Копии категорий называются экземплярами категорий, и каждому экземпляру присваивается набор стандартных счетчиков. Если категория может иметь более одного экземпляра, спецификация экземпляра должна быть включена в информацию счетчика.

Чтобы получить данные о производительности для счетчиков, которым требуется начальное или предыдущее значение для выполнения необходимых вычислений, дважды вызовите метод NextValue и используйте возвращенную информацию в соответствии с требованиями приложения.

Хватит теории, давайте пример.

Process[] processlist = Process.GetProcesses();
foreach (Process theprocess in processlist)            {
ramCounter  = new PerformanceCounter("Process", "Working Set", theprocess.ProcessName);
    double ram = ramCounter.NextValue();
    Console.WriteLine("Process: {0} ID: {1} Ram: {2}", theprocess.ProcessName, theprocess.Id, ram);
}
Console.ReadKey();
Вот, в переменной ram будет храниться память, используемая процессом. Получится что-то типа этого.



Но вот если мы таким же образом попробуем узнать загруженность процессора определённым процессом, то получим всегда нули.

cpuCounter = new PerformanceCounter("Process", "% Processor Time", item.ProcessName);
Почему? Метод nextValue() для процессора всегда возвращает значение 0 при первом вызове. Поэтому вы должны вызвать этот метод во второй раз. Или в третий. Чтобы корректно узнать, можно сделать, например, так:

cpuCounter = new PerformanceCounter("Process", "% Processor Time", item.ProcessName);
double cpu = 0;
double ram = ramCounter.NextValue();
for (int i=0; i<5;i++){
cpu = cpuCounter.NextValue();
if (cpu != 0) break;
}
То есть пять раз определяем загруженность процессора и если она не равна нулю, то выходим из цикла.



Если вам требуется помощь по C#, то вы можете написать мне. За небольшую сумму я вам помогу.



Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.



тегизаметки, си шарп, .NET

Читайте также:




Пример вычисления по формуле в C++
600 человек в день


© upread.ru 2013-2020
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.