Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебники 60143.doc
Скачиваний:
6
Добавлен:
01.05.2022
Размер:
1.21 Mб
Скачать

Программная реализация перечисления выполняющихся процессов

Чтобы посмотреть, как манипулировать типами Process, создадим новый проект типа С# (рис. 1) в виде консольного приложения по имени Processi (рис. 2).

Рис. 1. Создание проекта в среде Visual Studio

Рис. 2. Выбор и сохранение консольного приложения

Пользователю откроется окно редактора кода с заготовкой для проекта (рис. 3).

Рис. 3. Окно редактора кода проекта

Определим в проекте внутри класса Program вспомогательный статический метод ListAllRunningProcesses() (не забыв импортировать пространство имен System.Diagnostics).

Обратите внимание на то, что статический метод Process.GetProcesses() возвращает массив типов Process, которые представляют выполняющиеся процессы на целевой машине (используемое здесь обозначение в виде точки указывает на то, что в данном случае целевой машиной является локальный компьютер). После получения массива типов Process можно вызывать любой из описанных в табл. 2 член. Здесь отображается идентификатор (PID) и имя каждого процесса.

Далее надо изменить метод Main() так, чтобы он вызывал этот вспомогательный метод ListAllRunningProcesses() (рис. 4).

Вывод списка процессов ОС, т.е. результаты работы программы, представлен на рис. 5.

Рис. 4. Листинг программы получения списка процессов

Рис. 5. Вывод списка процессов ОС

Программная реализация изучения конкретного процесса

Помимо полного перечня всех выполняющихся на конкретной машине процессов статический метод Process.GetProcessById() также позволяет получать информацию о конкретном типе Process с помощью соответствующего идентификатора (PID). В случае запроса доступа к несуществующему PID генерируется исключение ArgumentException. Например, если необходимо получить информацию об объекте Process, представляющем процесс с PID-идентификатором 987, можно написать следующий код:

//В случае отсутствия процесса с PID-идентификатором 987

//во время выполнения будет генерироваться соответствующее //исключение.

static void GetSpecificProcess ()

{

Process theProc = null;

try

{

theProc = Process.GetProcessById(987);

}

catch // Общий блок catch используется для простоты.

{

Console.WriteLine("-> Sorry...bad PID!"); // неверный PID

}

}

Для выполнения данного метода надо в методе Main() добавить обращение к методу. Листинг программы представлен на рис. 6, а результат работы программы – на рис. 7.

Рис. 6. Обращение к конкретному процессу

При вводе пользователем программы номера процесса удобнее вводить номер процесса с именем explorer, поскольку информация не о всех процессах ОС доступна в пользовательском режиме.

Рис. 7. Результат обращения к заданному процессу

Программная реализация изучения ряда потоков внутри процесса

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

static void GetSpecificProcess(int pID)

{

Process theProc = null;

Try

{

theProc = Process.GetProcessById(pID);

}

catch // Общий блок используется для простоты.

{

Console.WriteLine("-> Извините...неверный номер процесса PID!"); // неверный PID

return;

}

// Отображение статистических данных по каждому

//потоку в указанном процессе

Console.WriteLine("Информация о процессе: {0}", theProc.ProcessName);

ProcessThreadCollection theThreads = theProc.Threads;

foreach(ProcessThread pt in theThreads)

{

string info = string.Format("-> Поток ID:

{0}\tВремя старта {1}\tПриоритет {2}",

pt.Id , pt.StartTime.ToShortTimeString(),

pt.PriorityLevel);

Console.WriteLine(info);

}

Console.WriteLine("***********************\n");

}

После написания кода в методе Main(), позволяющего пользователю вводить номер процесса, и организации обращения к представленному в листинге методу GetSpecificProcess приложение выдаст следующий результат работы программы (рис. 8).

Рис. 8. Информация о потоках заданного процесса

Тип ProcessThread не является сущностью, применяемой для создания, приостановки и уничтожения потоков в .NET. Он представляет собой средство, служащее для получения диагностической информации по активным потокам Win32 внутри выполняющегося процесса.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]