Домой Process Загрузка центрального процессора: Справочник по C#

Загрузка центрального процессора: Справочник по C#

855
0


      Чтобы определить тип (модель), количество ядер, загрузку процессора и многое другое, можно воспользоваться классом инструментария управления Windows (WMI(http://ru.wikipedia.org/wiki/WMI)) Win32_Processor в пространстве имен rootcimv2. Сам класс является производным от класса CIM_Processor, ключевым свойством является DeviceID. Рассмотрим получение тип, количество ядер и загрузку процессора установленного на компьютере. Для получения данной информации воспользуемся тремя свойствами данного класса.

  • Name – Метка или модель процессора (CIM_ManagedSystemElement);
  • NumberOfLogicalProcessors – Количество логических процессоров для данного экземпляра процессора, свойство не поддерживается в Windows Server 2003 и Windows XP;
  • LoadPercentage – Показывает среднее значение загрузки процессора за последнюю секунду, (CIM_Processor).

      Соответственно необходимо добавить три элемента управления «Label» для вывода данной информации. У вас получится приведенный ниже пример.

      Так как стоит задача получения загруженности процессора, необходимо постоянно обновлять эти данные, это означает, что запрос будет обрабатываться в цикле. Но тут возникает проблема, так как форма запускается в одном потоке, то при каждом получении информации приложение на период обмена перестает реагировать на действия извне (не может обрабатывать сообщения клавиатуры и мыши и создается ощущение, что программа зависла). Для этого необходимо организовать многопоточность.
      Для организации многопоточности в Microsoft Visual Studio есть элемент управления «BackgroundWorker». BackgroundWorker — (System.ComponentModel.BackgroundWorker) класс или элемент управления, предназначенный для создания и управления работой потоков. Он предоставляет следующие возможности:

  • Возможность прерывания потока;
  • Возможность обработки исключений в фоновом потоке;
  • Стандартизированный протокол создания, сигнализации о ходе выполнения и завершения потока;
  • Возможность связи с основным потоком через сигнализацию о ходе выполнения и окончания;
  • Возможность использования как элемента управления в Visual Studio Net.

BackgroundWorkerпредоставляет следующие основные методы:

  • CancelAsync — можно использовать для досрочного завершения фоновой операции. CancelAsync устанавливает соответствующее значение свойства CancellationPending. Фоновый код, поддерживающий досрочное завершение, проверяет значение этого свойства и, как только оно становится равным True, завершает свое выполнение.
  • DoWork — вызывается при старте потока. В методе можно определить код, который будет выполняться в отдельном потоке. 
  • ProgressChanged — может быть использован для отслеживания прогресса выполнения фонового потока.
  • RunWorkerAsync — служит для запуска потока.
  • RunWorkerCompleted — вызывается по завершении выполнения потока.

Перейдите в панель элементов и добавьте на главную форму компонент «BackgroundWorker».

      Визуальный конструктор форм Microsoft Visual Studio поместит данный компонент в специальную область, называемую лотком компонентов (здесь представлены все размещенные на форме компоненты). Это позволяет вам работать с компонентами точно так же, как и с элементами управления (просто щелкая по ним), но при этом на форме не появляется их визуальное представление (поскольку компонент не имеет визуального представления). Сделайте двойной клик по компоненту «backgroundWorker1» в лотке компонентов, вы перейдете в автоматически созданный метод «backgroundWorker1_DoWork». Код в данном методе, будет выполняться в отдельном потоке.

string constLabel = label3.Text;
searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_Processor");

foreach (System.Management.ManagementObject queryObj in searcher.Get())
{
label3.Text = constLabel+ queryObj["LoadPercentage"].ToString();
}

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

string constLabel;
public void CPU()
{
string constLabel;
//Переменная подсчета количества ядер
int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
//Получение модели процессора
label1.Text = item["Name"].ToString();
//Получение количества ядер
coreCount += int.Parse(item["NumberOfCores"].ToString());
}

label2.Text = label2.Text + coreCount.ToString();
//Запоминаем текст в компоненте label3
constLabel = label3.Text;

backgroundWorker1.RunWorkerAsync();
}

      Для запуска данного метода, перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по пустому месту формы. Вы перейдете в автоматически созданное событие «Form1_Load», которое происходит при каждой загрузке данной формы пользователем. В нашем случае при запуске вашего проекта. Добавьте в тело данного события код вызова метода «CPU».

private void Form1_Load(object sender, EventArgs e)
{
//Запуск процесса получения данных при запуске программы
CPU();
}

      Если вы сейчас запустите данный проект, Microsoft Visual Studio сообщит об ошибке «System.InvalidOperationException: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления «label3» не из того потока, в котором он был создан».

      Поскольку получение данных выполняется в отдельном потоке, не допускаются манипуляции с элементами формы. Это ограничение связано с тем, что обработка сообщений происходит именно в том потоке, в котором изначально создан элемент. Для устранения данной ошибки необходимо для элемента управления «label3» создать дополнительный метод, через который будет выполняться вывод данных. Данный метод делается защищенным (thread-safe) для вызова из любых потоков через delegate, InvokeRequired, MethodInvoker и BeginInvoke.
      Каждый элемент управления «Windows Forms» имеет свойство «InvokeRequired», которое вернет «false», если текущий поток является «родным» для элемента управления, т. е. является потоком очереди сообщений. Также имеется метод «BeginInvoke», который выполняет указанный делегат «MethodInvoker» асинхронно с указанными аргументами в потоке, в котором был создан базовый дескриптор элемента управления. Добавьте приведенный ниже метод в код главной формы.

public void LoadCpu(string loadcpu)
{
try
{
if (this.InvokeRequired)
BeginInvoke(new MethodInvoker(delegate
{ label3.Text = loadcpu; }));
else
label3.Text = loadcpu;
}
catch (Exception ex)
{ MessageBox.Show(ex.Message);}
}

      После добавления метода «LoadCpu», в методе «backgroundWorker1_DoWork» замените строчку вывода данных в компонент «label3» на приведенный ниже код.

LoadCpu(constLabel+ queryObj["LoadPercentage"].ToString() + "%");

      Запустите ваш проект, нажав на клавиатуре, клавишу «F5». После запуска вашего проекта вы увидите данные о модели, количестве ядер и загруженность вашего процессора в процентах. Для сравнения, запустите «Диспетчер задач Windows» и перейдите в кладку «Быстродействие». В верхней части вкладки вы увидите такое же значение загруженности процессора, как и в вашем проекте.

      Так же можно реализовать графическое представление загруженности процессора через элемент управления «ProgressBar». Перейдите в конструктор главной формы и добавьте элемент управления «ProgressBar».

      После добавления данного компонента, сделайте по нему клик правой клавишей мыши и выберите из появившегося контекстного меню, пункт «Свойства».

      У вас откроется панель свойств данного компонента. Найдите свойство «Step», устанавливающее текущее положение индикатора выполнения в данном компоненте. По умолчанию выставлено значение 10, измените его на 1. Как и в случае с компонентом «label3» вы не можете обратиться к данному элементу управления из другого потока. Добавьте приведенный ниже метод в код главной формы.

public void LoadCpuProgressBar(int loadcpu)
{
try
{
if (this.InvokeRequired)
BeginInvoke(new MethodInvoker(delegate
{ progressBar1.Value =  loadcpu; }));
else
progressBar1.Value = loadcpu;
}
catch (Exception ex)
{ MessageBox.Show(ex.Message); }
}

      Что бы воспользоваться данным методом в методе «backgroundWorker1_DoWork» добавьте строчку кода вывода данных в компонент «ProgressBar» на приведенный ниже код, после строки кода вывода данных в компонент «labe3» (LoadCpu).

LoadCpuProgressBar(Convert.ToInt16(queryObj["LoadPercentage"]));

      Запустите ваш проект, нажав на клавиатуре клавишу «F5». После компиляции и запуска вашего проекта, вы увидите графическое представление загруженности вашего процессора.

Для организации графического вертикального отображения загруженности процессора через компонент «ProgressBar», воспользуйтесь инструкцией «Вертикальный ProgressBar» по адресу http://csharpcoderr.com/2014/01/vertical-progressbar.html.

Ссылка для скачивания примера: Rusfolder.net

Загрузка центрального процессора: Справочник по C#

0.00 (0%) 0 votes

ЧИТАТЬ ТАКЖЕ:  Читаем стандартный вывод консольного приложения + DOS to UTF: Справочник по C#

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь