- •6. Лабораторная работа № 7
- •6.1. Общие методические указания по выполнению лабораторной работы
- •6.2. Теоретические сведения
- •6.2.1. Общие сведения о процессах и потоках
- •6.2.2. Диспетчеризация задач с использованием
- •6.2.3. Описание свойств и методов элемента управления ListView
- •6.2.4. Получение информации о процессах и потоках
- •6.2.5. Изменение базового приоритета процесса
- •6.3.Задание на лабораторную работу
- •6.4. Проверка правильности функционирования созданной программы
- •6.5. Отчет по лабораторной работе
6.2.3. Описание свойств и методов элемента управления ListView
Элемент управления ListView позволяет выводить на экран список элементов с текстом, а в некоторых случаях и со значком, служащим для определения типа элемента. Класс ListViewItem представляет элемент в элементе управления ListView. Табличное представление позволяет отображать элемент и его подэлементы в сетке с заголовками столбцов, описывающих данные, отображаемые в подэлементе. Элемент управления ListView поддерживает выбор одного или нескольких элементов. Для пользователя предусмотрена функция выбора нескольких элементов из списка, предоставляющая возможности, аналогичные тем, которые обеспечивает элемент управления ListBox. Кроме того, пользователь может активировать выделенные элементы для выполнения некоторой задачи.
Класс ListView предоставляет множество свойств, обеспечивающих гибкость представления и поведения.
Основные свойства элемента управления ListView
Вывод данных в таблицу осуществляется следующим образом:
ListViewItem ^newIt = gcnew(ListViewItem);
newIt Text = ”Текст 1-го столбца”;
newItSubItems Add(Convert::ToString(“Текст 2-го столбца”));
…
newIt SubItems Add(Convert::ToString(“Текст n-го столбца”);
listView1 Items Add(newIt);
Здесь listView1 – имя элемента управления.
Приведённый выше пример кода заполняет 1 строку. Чтобы заполнить нужное количество строк необходимо написать данный код в цикле.
Очистить строки и столбцы элемента управления можно так:
listViewItems Clear();
Свойство Columns возвращает коллекцию, содержащую объекты ColumnHeader, отображаемые в данном элементе управления ListView. Объекты ColumnHeader определяют столбцы, отображаемые в элементе управления ListView при установке свойства View равным Details. Каждый столбец используется для отображения сведений о подэлементах для каждого элемента в элементе управления ListView. Свойство Text каждого объекта ColumnHeader задаёт имя столбца элемента управления ListView.
Свойство Scrollable возвращает или задает значение, указывающее, добавляется ли к этому элементу управления полоса прокрутки, если для отображения всех элементов не хватает места.
Свойство GridLines возвращает или задает значение, показывающее, будут ли видны в элементе управления линии сетки между строками и столбцами, содержащими элементы и подэлементы.
Среди множества событий элемента управления ListView следует отметить событие MouseClick, возникающее в момент, когда пользователь щелкает элементы в элементе управления ListView. В обработчике этого события можно через имя элемента управления обратиться к свойству SelectedItems класса ListView, которое получает элементы, выбранные в данном элементе управления. Например:
private:System::Void listView1_MouseClick(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
SI = listView1 SelectedItems;
}
Здесь SI – объект класса SelectedListViewItemCollection, который можно объявить в защищённых членах класса формы:
ListView::SelectedListViewItemCollection^ SI;
6.2.4. Получение информации о процессах и потоках
Для получения информации о процессах необходимо заявить об использовании пространства имён System::Diagnostics в пространстве имён программы:
using namespace System::Diagnostics;
В пространстве имен System::Diagnostics поставляется ряд типов, которые позволяют программно взаимодействовать с процессами и различными связанными с диагностикой средствами наподобие системного журнала событий и счетчиков производительности. Некоторые наиболее важные из них перечислены в таблице 1.
Таблица 1
Типы System::Diagnostics, которые позволяют взаимодействовать с процессами
|
Описание |
Process
|
Предоставляет доступ к локальным и удаленным процессам, а также позволяет запускать и останавливать процессы программным образом.
|
ProcessModule
|
Позволяет представлять модуль (*.dll или *.exe), который должен загружаться в определенный процесс. Важно понимать, что этот тип может применяться для представления любого модуля: на базе COM, на базе .NET или традиционного двоичного модуля на базе C.
|
ProcessStartInfo
|
Позволяет указывать ряд значений, которые должны использоваться при запуске процесса посредством метода ProcessStart().
|
ProcessThread
|
Позволяет представлять поток внутри определенного процесса. Следует иметь в виду, что этот тип применяется для осуществления диагностики ряда потоков в процессе, но не для ответвления внутри него новых потоков.
|
ProcessPriorityClass |
Перечисление, которое указывает приоритет, который система связывает с процессом. Это значение, вместе со значением приоритета каждого потока процесса, определяет базовый уровень приоритета каждого потока.
|
Тип System::Diagnostics::Process позволяет анализировать процессы, выполняющиеся на определенной машине (как локальной, так и удаленной). Класс Process обладает членами, которые позволяют запускать и останавливать процессы программным образом, просматривать приоритет процесса, а также получать список активных потоков и/или загруженных модулей, которые выполняются в рамках конкретного процесса. В табл. 2 перечислены некоторые наиболее важные члены System::Diagnostics::Process.
Таблица 2
Член класса |
Описание |
ProcessName |
Представляет собой свойство и позволяет получать имя процесса (которое, как не трудно догадаться, совпадает с именем самого приложения). |
Id |
Представляет собой свойство и позволяет получать идентификатор (PID) соответствующего процесса. |
BasePriority |
Представляет собой свойство и позволяет получать значение базового приоритета процесса. |
Threads |
Представляет собой свойство и позволяет получать информацию о потоках, которые выполняются в рамках соответствующего процесса (в виде массива типов ProcessThread). |
StartTime |
Представляет собой свойство и позволяет получать информацию о времени, когда был запущен соответствующий процесс (в виде типа DateTime). |
GetProcesses() |
Представляет собой статический метод и возвращает массив новых компонентов Process, которые выполняются на текущей машине. |
GetProcessesByName() |
Представляет собой статический метод и возвращает массив из новых компонентов Process и связывает их со всеми ресурсами процесса на удаленном компьютере, для которых заданное имя процесса является общедоступным. |
PriorityClass |
Представляет собой свойство и позволяет считывать или изменять приоритет соответствующего процесса. |
Kill() |
Представляет собой метод и позволяет немедленно останавливать соответствующий процесс. |
Start() |
Представляет собой метод и позволяет запускать процесс. |
MainWindowTitle |
Представляет собой свойство и позволяет получать заголовок главного окна процесса (если у процесса нет такового, возвращается пустая строка). |
Лучше всего написать функцию типа void (ничего не возвращает, подобие процедуры в Паскале), и в ней получать информацию о процессах, поскольку её можно будет свободно вызвать по имени в любом месте программы. Например, при любом нашем изменении обновлять список процессов.
Так как статический метод GetProcesses() возвращает массив новых компонентов Process, которые выполняются на текущей машине, то соответственно следует объявить массив, в котором будут храниться компоненты Process:
array<Process^> ^localAll = Process::GetProcesses();
Количество процессов равно количеству элементов данного массива. Свойство Length возвращает длину массива:
localAll Length;
Аналогичным образом по ссылке на объект класса (через «») получают всю остальную информацию о процессах. Например, имя процесса, которое будет выводиться в элементе управления ListView можно получить так:
newItText=localAll[i] ProcessName;
Чтобы обратиться к свойству PriorityClass, необходимо поставить значение UseShellExecute свойства Process::StartInfo в false, которое возвращает или задаёт значение, позволяющее определить, нужно ли использовать оболочку операционной системы для запуска процесса:
localAll[i] StartInfoUseShellExecute=false;
Необходимо отметить, что один процесс с именем Idle (бездействие системы) не позволяет получать свои время запуска, класс приоритета и заголовок главного окна процесса, но, зная, что он в массиве последний, можно его «пропустить». Например, так:
if(i<localAllLength-1){
newItSubItemsAdd(Convert::ToString(localAll[i] StartTime));
newIt SubItems Add(Convert::ToString(localAll[i] PriorityClass));
newItSubItemsAdd(Convert::ToString(localAll[i] MainWindowTitle));}
Для преобразования типов к типу String можно воспользоваться статическим методом ToString класса Convert. Например:
newItSubItemsAdd(Convert::ToString(localAll[i] StartTime));