Разработка электронного приложения 'Инспектор процессов и потоков'

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    1,67 Мб
  • Опубликовано:
    2012-12-16
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Разработка электронного приложения 'Инспектор процессов и потоков'

Аннотация

Цель курсовой работы - разработать электронное приложение «инспектор процессов и потоков».

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

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

Была произведена апробация на нескольких учебных компьютерах, которая показала, что использование электронного приложения в среде С++Builder 6.0. позволяет получить информацию о всех процессах, которые были запущенны на этих компьютерах, что удовлетворяет требованиям задания.

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

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

Содержание

Введение

Анализ

Проектирование

Кодирование и отладка

Тестирование

Сопровождение

Заключение

Список использованной литературы

Приложения

Введение

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

В ходе проектирования необходимо рассмотреть все возможные подходы и методы решения поставленной задачи и выбрать оптимальный.

Цель курсовой работы - разработать электронное приложение «инспектор процессов и потоков».

Для достижения цели нам нужно выполнить следующие задачи:

§  изучить и проанализировать учебно-методическую документацию, учебную литературу и интернет - источники по выбранной теме дисциплины;

§  выбрать наиболее оптимальный способ реализации поставленной цели;

§  определить набор функций, необходимых для реализации приложения;

разработать и протестировать приложение «инспектор процессов и потоков». Конечным результатом данного проекта является программа «инспектор процессов и потоков».

Конструктивно курсовая работа состоит из 4 разделов.

В первом разделе работы проведён анализ предметной области, а также найдены существующие решения задачи. Описан способ его реализации с помощью библиотек Tool Help Library(THL) и Performance Data Helper (PDH).

Во втором разделе представлен план реализации приложения.

Третий раздел содержит функции и их параметры, по средствам которых производится решение задачи.

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

Сопровождение содержит описание работы приложения.

При написании было использовано 3 источника литературы. Основным был Таненбаум Э. «Современные Операционные системы».

Анализ

Потоки и процессы - это связанные понятия в вычислительной технике. Оба представляют из себя последовательность инструкций, которые должны выполняться в определенном порядке. Инструкции в отдельных потоках или процессах, однако, могут выполняться параллельно.

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

Существование нескольких процессов позволяет компьютеру "одновременно" выполнять несколько задач. Существование нескольких потоков позволяет процессу разделять работу для параллельного выполнения. На многопроцессорном компьютере процессы или потоки могут работать на разных процессорах. Это позволяет выполнять реально параллельную работу.

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

Для получения информации о процессах в курсовом проекте были использованы две бибилиотеки: Tool Help Library(THL) и Performance Data Helper (PDH). С помощью библиотеки THL можно извлечь информацию о запущенных процессах: имя процесса, идентификатор процесса (PID), приоритет процесса, количество потоков, идентификатор процесса (PID) родителя. Этой информации не достаточно для решения поставленной задачи. Поэтому с помощью библиотеки THL будем извлекать только имя процесса, всю остальную информацию о процессах будем получать с помощью библиотеки PDH (информация извлекаемая с помощью библиотеки THL плюс загруженность процесса, виртуальная память, память подкачки). Для создания приложения будем использовать среду разработки С++Builder 6.0.

Проектирование

программный код локальный компьютер

Задача проектирования была разбита на несколько этапов:

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

.        Создание компонента Timer. В его обработчик события помещается основной код программы

.        Получение списка имен процессов запущенных на локальном компьютере

.        Удаление в имени процесса разрешения «exe»

.        Добавление порядкового номера к повторяющемуся имени процесса

.        Собрание необработанных значений данных для всех счетчиков в указанном запросе

После двух срабатываний таймера приложение заново составит список имен запушенных процессов и далее будет работать по вышеописанному алгоритму, но перед этим очистит список.

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

Так же на поле формы помещаем две кнопки с именами «Button1» и «Button2».

Кнопка «Button1» нужна для завершения выбранного пользователем процесса, а кнопка «Button2» для выхода и завершения работы приложения.

Помимо на форму помещается компонент класса TTimer с именем «Timer1»:

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

Рис.1.1 Главная форма приложения (Form1)

Кодировка и отладка

Целью данного этапа является программная реализация проектных решений, полученных на этапе проектирования, т.е. создание работоспособного программного продукта. Для реализации проекта выбран язык С++Builder 6.0, а так же воспользуемся функциями библиотек Tool Help Library (THL) и Performance Data Helper (PDH)

Рассмотрим подробно каждый этап:

.        Получение снимка всех процессов

Для получения списка запущенных процессов необходимо инициализировать структуру PROCESSENTRY32:

typedef struct tagPROCESSENTRY32 { dwSize; Размер струтуры в байтах

DWORD cntUsage;th32ProcessID; Идентификатор процессаth32DefaultHeapID;th32ModuleID; cntThreads;  Число потоков в процессе

DWORD th32ParentProcessID; Идентификатор родительского процесса

LONG pcPriClassBase; Базовый приоритет какого-либо потока процесса

DWORD dwFlags;

TCHAR szExeFile[MAX_PATH]; Имя исполняемого процесса

DWORD th32MemoryBase;th32AccessKey;; PROCESSENTRY32* PPROCESSENTRY32;

Для использования данной функции необходимо подключить библиотеку tlhelp32.

Затем вызывается функция

DWORD th32ProcessID).

Первый параметр dwFlags - определяет тип моментального снимка и указывает, какая именно информация интересует пользователя. В курсовом проекте используется значение TH32CS_SNAPPROCESS позволяющее получить список запущенных на локальном компьютере процессов.

Второй параметр th32ProcessID , указывает идентификатор процесса, для которого будет создаваться моментальный снимок Этот параметр в курсовом проекте устанавливаем NULL.

.        Извлечение информации о первом процессе, записанном в снимок

Будем использовать функцию Process32FirstWINAPI Process32First (HANDLE hSnapshot, LPPROCESSENTRY32 lppe).

Данная функция возвращает TRUE, в случае успеха получения информации о первом процессе из снимка процессов и FALSE в обратном случае. Заполняет структуру lppe необходимой информацией о первом процессе из снимка, сделанного функцией CreateToolhelp32Snapshot.

.        Извлечение информации о других процессах, записанных в снимок

Будем использовать функцию Process32NextWINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe).

Данная функция извлекает информацию о следующем процессе.

Первый параметр hSnapshot - дескриптор снимка, возвращаемый от предыдущего вызова функции СreateToolhelp32Snapshot.

Второй параметр lppe - адрес структуры PROCESSENTRY32.

Перед вызовом функции Process32First необходимо установить в поле dwSize структуры PROCESSENTRY32 значение, которое равно размеру самой структуры sizeof(PROCESSENTRY32), иначе функция возвращает ошибку.

.        Сортировка полученного списка

На данном этапе отслеживается появление разрешения «exe» в имени процесса, а затем удаляется.

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

В списке попадаются процессы с одинаковым именем, к повторяющемуся имени добавляется «#порядковый номер».

.        Получение имени локального компьютера

Используем функцию BOOL WINAPI GetComputerName( LPTSTR lpBuffer, LPDWORD lpnSize).

Первый параметр lpBuffer - указатель на буфер, который получает сетевое имя или кластерное виртуальное имя сервера.

Второй параметр lpnSize - определяет размер требуемого буфера, включая закончившийся нулевой символ.

.        Создание запроса

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

PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,_PTR dwUserData,_HQUERY *phQuery).

Первый параметр szDataSource - строка, которая определяет имя файла журнала, из которого извлекаются данные о производительности. If NULL, performance data is collected from a real-time data source. Если NULL, данные о производительности собираются из источника данных в реальном времени.

Второй параметр dwUserData - определяемое пользователем значение, связанное с этим запросом. В нашем случае NULL.

.        Добавление счетчика к запросу

При помощи функции PdhAddCounter добавляется счетчик к запросу, сделанному с помощью функции PdhOpenQuery.

PDH_STATUS PdhAddCounter ( PDH_HQUERY hQuery,szFullCounterPath,_PTR dwUserData,_HCOUNTER *phCounter).

Первый параметр hQuery - Дескриптор запроса Этот дескриптор возвращен функцией PdhOpenQuery.

Второй параметр szFullCounterPath - строка с нулевым символом в конце, которая содержит путь счетчика.

Третий параметр dwUserData - определяемое пользователем значение. Это значение становится частью информацией счетчика. В нашем приложении NULL.

Четвертый параметр phCounter - дескриптор на счетчик, который был добавлен к запросу. Будем ссылаться на этот дескриптор в последующих запросах.

.        Собрание всех текущих необработанных значений данных для всех счетчиков в указанном запросе

Делаем это с помощью функции_STATUS PdhCollectQueryData(PDH_HQUERY hQuery).

Параметр hQuery - дескриптор запроса, для которого хотим собрать данные. Функция PdhOpenQuery возвращает этот дескриптор.

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

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

PDH_STATUS PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter,dwFormat,lpdwType,_FMT_COUNTERVALUE pValue).

Первый параметр hCounter - дескриптор счетчика, для которого хотим получить информацию. Функция PdhAddCounter возвращает этот дескриптор.

Второй параметр dwFormat- определяет тип данных отформатированного значения. В приложении используем значение PDH_FMT_DOUBLE.

Третий параметр lpdwType- этот параметр является дополнительным. В нашем случае устанавливаем NULL.

Четвертый параметр pValue - структура PDH_FMT_COUNTERVALUE, которая получает значение счетчика.

.        Обновление списка запущенных процессов

Для этого надо сначала удалить счетчики из запроса это делаем функцией

PDH_STATUS PdhRemoveCounter (PDH_HCOUNTER hCounter).

Две следующие функции потребуются для завершения выделенного процесса в таблице. Это функцияOpenProcess (DWORD dwDesiredAccess,bIn-heritHandle,dwProcessId).

Функция возвращает дескриптор существующего процесса.

Первый параметр dwDesiredAccess - флаг определяющий доступ к процессу. В курсовой работе будем использовать флаг PROCESS_TERMINATE необходимый для завершения работы процесса с использованием функции TerminateProcess.

Второй параметр bIn-heritHandle - флаг, указывающий, является ли создаваемый дескриптор наследуемым. Он установлен в значение TRUE это означает, что дескриптор наследуемый.

Третий параметр dwProcessId - идентификатор процесса.

И вторая функция (строка 180) завершает работу заданного процесса и всех его потоков:

BOOL TerminateProcess(HANDLE hProcess,UINT uExitCode).

Первый параметр hProcess - дескриптор процесса.

Второй параметр uExitCode - код завершения процесса. Этот параметр в курсовом проекте устанавливаем NULL.

Функция используется для закрытия открытого дескриптора объекта

BOOL CloseHandle (HANDLE hObject).

Параметр hObject - дескриптор объекта.

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

Следующая переменная b получает идентификатор процесса (PID), но перед этим извлеченный идентификатор из таблицы переведем из типа AnsiString в тип int .

Тестирование

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

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

Рис 2.1 Главное окно приложения

Рис 2.2 Вторичное окно приложения

Рис 2.3 Вторичное окно приложения

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


Как видно на рис 2.1-2.4 все имена процессов, их число, соответствующие идентификаторы и количество потоков в процессе полностью совпадают.

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

Рис 2.5 Вторичное окно приложения

Рис 2.6 Вторичное окно приложения

Как мы видим из рис 2.6 завершение процесса блокнот прошло успешно.

Сопровождение

Для запуска приложения необходимо запустить исполняемый файл «Инспектор процессов». При запуске выводится список процессов, действующих в настоящий момент и информация о них. При нажатии кнопки «Завершение процесса» выделенный процесс в списке завершается, а при нажатии кнопки «Выход» приложение закрывается.

Но в процессе разработки приложения была выявлена одна проблема. Данное приложение не работает эффективно на компьютерах, у которых стоит англоязычная версия ОС Windows. Для устранения этой проблемы было создано два пакета программ как для русскоязычной версии Windows так и англоязычной. Для того, чтобы разработать приложение для англоязычной версии ОС была выбрана среда разработки Embarcadero C++Builder XE3.(Код программы представлен в приложении С). Но полностью решить возникшую проблему не удалось, так как функция PdhAddEnglishCounter, которая была использована для разработки приложения для англоязычных версий ОС, поддерживается лишь с версии ОС Vista и выше. На версиях ниже ОС Vista приложение с использованием этой функции работать не будет.

Заключение

В рамках выполнения курсового проекта по дисциплине «Операционные системы» была изучена и проанализирована учебно-методическая документация, учебная литература и интернет - источники по выбранной теме дисциплины

Были рассмотрены различные методы решения этой задачи и выбран наиболее удобный вариант или алгоритм.

Был определен набор функций, необходимых для реализации поставленной цели.

Разработан программный код и произведена его отладка.

Итогом данного курсового проектирования является приложение «Инспектор процессов и потоков». Приложение позволяет получать подробную информацию о всех процесса, запущенных на локальном компьютере, при желании пользователя возможность завершения выбранного им процесса. Для проверки корректности работы программы было произведено несколько тестов, результаты которых не было выявлено явных ошибок в работе программы.

Для достижения цели были выполнены следующие задачи:

§  изучена и проанализирована учебно-методическая документация, учебная литература и интернет - источники по выбранной теме дисциплины;

§  выбран наиболее оптимальный способ реализации поставленной цели;

§  определен набор функций, необходимых для реализации поставленной цели;

§  разработано и протестировано приложение «Инспектор процессов и потоков»;

В результате выполнения курсового проекта цель достигнута, задачи полностью реализованы.

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

Список использованной литературы

1.       Пахомов Б.И. Самоучитель С\С++ и С++ Builder 2007. - СПб.: БХВ-Петербург, 2008. - 672 с.: ил. + Дистрибутив (на DVD)

.        П.В. Гришмановский, И.Н. Даниленко. - Курсовое проектирование. Разработка программного обеспечения. Методические указания к выполнению курсовых проектов для студентов специальностей 210100 «Управление и информатика в технических системах» и 220400 «Программное обеспечение вычислительной техники и автоматизированных систем». Сургут: Издательство СурГУ, 2004. - 23с

.        Таненбаум Э. «Современные Операционные системы»

Приложения

Приложение А

Программный код заголовочного файла Unit1.h:

#ifndef Unit1H

#define Unit1H

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <Grids.hpp>

#include <DB.hpp>

#include <DBTables.hpp>

#include <ExtCtrls.hpp>

#include "Excel_2K_SRVR.h"

#include <OleServer.hpp>TForm1 : public TForm

{

__published:// IDE-managed Components*Button1;*Button2;*StringGrid1;*Timer1;__fastcall Timer1Timer(TObject *Sender);__fastcall StringGrid1SelectCell(TObject *Sender, int ACol,ARow, bool &CanSelect);__fastcall Button2Click(TObject *Sender);__fastcall Button1Click(TObject *Sender);:// User declarations_FMT_COUNTERVALUE fmtValue;computername[MAX_COMPUTERNAME_LENGTH];long size;* procnames;:// User declarations

__fastcall TForm1(TComponent* Owner);hQuery;

};PACKAGE TForm1 *Form1;

#endif

Приложение Б

Код программы:

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#include <tchar.h>

#include <pdh.h>

#include <pdhmsg.h>

#include <vcl.h>

#include <math.h>

#include <PDHMSG.H>

#pragma hdrstop

#include "Unit1.h"

#include "tlhelp32.h"

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;b,c,i,j,a=0;StrCounters[7][30]={"Идентификатор процесса",

"Базовый приоритет",

"Счетчик потоков",

"Код (ID) создавшего процесса",

"% загруженности процессора",

"Байт виртуальной памяти",

"Байт файла подкачки"};

__fastcall TForm1::TForm1(TComponent* Owner)

{= new TStringList;= MAX_COMPUTERNAME_LENGTH;->Cells[0][0]="№";->Cells[1][0]="Имя образа";->Cells[2][0]="PID";->Cells[3][0]="Приоритет";->Cells[4][0]="Кол-во потоков";->Cells[5][0]="PID родителя";->Cells[6][0]="Загр. процесса" ;->Cells[7][0]="Вирт. память" ;->Cells[8][0]="Память подк." ;(computername,&size);(NULL, NULL, &hQuery);

}__fastcall TForm1::Timer1Timer(TObject *Sender)

{

{h;p;.dwSize = sizeof(PROCESSENTRY32);=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);(a==1)

{>Clear();(j=1;j<StrToInt(StringGrid1->RowCount);j++)

{(i=2;i<9;i++)

{(*(HCOUNTER*)(StringGrid1->Objects[i][j]));(HCOUNTER*)(StringGrid1->Objects[i][j]);

}

}

}=1;(Process32First(h,&p))

{

{>Add(p.szExeFile);

}(Process32Next(h,&p));

}>Sort();(i=0; i < procnames->Count; i = j)

{name= procnames->Strings[i].SubString(procnames->Strings[i].Length()-2,3);(name == AnsiString("exe")||name == AnsiString("EXE"))

{(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )

{>Strings[j]= procnames->Strings[j].SubString(1,procnames->Strings[j].Length()-4);>Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);

}>Strings[i]= procnames->Strings[i].SubString(1,procnames->Strings[i].Length()-4);

}

{(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )

{>Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);

}(procnames->Strings[i]=="[System Process]")>Strings[i]="_Total" ;

}

}* pCounter;(i=0; i < procnames->Count; i++)

{pro = procnames->Strings[i];(j=0;j<7;j++)

{= new HCOUNTER;s=AnsiString("\\\\"+AnsiString(ComputerName)+"\\Процесс("+pro+")\\"+AnsiString(StrCounters[j]));(hQuery, s.c_str(), 0, pCounter);->Objects[2+j][i+1] = (TObject*)pCounter;

}

}

}++;_STATUS pdhStatus= 0;(hQuery);(i=0; i < procnames->Count; i++)

{->Cells[0][i+1]=i+1;->Cells[1][i+1]=procnames->Strings[i];(j=2;j<9;j++)

{(j<7)

{(j==6)

{( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);->Cells[j][i+1]=(unsigned long int)(fmtValue.doubleValue);

}

{=PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);(pdhStatus==PDH_INVALID_DATA)

{(hQuery);( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);

}->Cells[j][i+1]= fmtValue.doubleValue;

}

}

{( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);->Cells[j][i+1]= (unsigned long int)(fmtValue.doubleValue)/1024;

}

}

}->RowCount=procnames->Count + 1;

}__fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,ARow, bool &CanSelect)

{=ARow;

}__fastcall TForm1::Button2Click(TObject *Sender)

{();

}__fastcall TForm1::Button1Click(TObject *Sender)

{l;=StrToInt(StringGrid1->Cells[2][c]);=OpenProcess (PROCESS_TERMINATE,true,b);(l,0);(l);

}

Приложение C

#include <windows.h>

#include <stdio.h>

#include <conio.h>

#include <tchar.h>

#include <pdh.h>

#include <pdhmsg.h>

//#include <vcl.h>

#include <math.h>

#include <PDHMSG.H>

#pragma hdrstop

#include "Unit1.h"

#include "tlhelp32.h"

#pragma package(smart_init)

#pragma resource "*.dfm"*Form1;b,c,i,j,a=0;StrCounters[7][30]={"ID Process",

"Priority Base",

"Thread Count",

"1410

"% Processor Time",

"Virtual Bytes",

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{= new TStringList;= MAX_COMPUTERNAME_LENGTH;->Cells[0][0]="№";->Cells[1][0]="Имя образа";->Cells[2][0]="PID";->Cells[3][0]="Приоритет";->Cells[4][0]="Кол-во потоков";->Cells[5][0]="PID родителя";->Cells[6][0]="Загр. процесса" ;->Cells[7][0]="Вирт. память" ;->Cells[8][0]="Память подк." ;(computername,&size);(NULL, NULL, &hQuery);

}__fastcall TForm1::Timer1Timer(TObject *Sender)

{

{h;p;.dwSize = sizeof(PROCESSENTRY32);=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);(m==1)

{>Clear();(j=1;j<StrToInt(StringGrid1->RowCount);j++)

{(i=2;i<9;i++)

{(*(HCOUNTER*)(StringGrid1->Objects[i][j]));(HCOUNTER*)(StringGrid1->Objects[i][j]);

}

}

}=1;(Process32First(h,&p))

{

{>Add(p.szExeFile);

}(Process32Next(h,&p));

}>Sort();(i=0; i < procnames->Count; i = j)

{name= procnames->Strings[i].SubString(procnames->Strings[i].Length()-2,3);(name == AnsiString("exe")||name == AnsiString("EXE"))

{(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )

{>Strings[j]= procnames->Strings[j].SubString(1,procnames->Strings[j].Length()-4);>Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);

}>Strings[i]= procnames->Strings[i].SubString(1,procnames->Strings[i].Length()-4);

}

{(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )

{>Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);

}(procnames->Strings[i]=="[System Process]")>Strings[i]="_Total" ;

}

}* pCounter;(i=0; i < procnames->Count; i++)

{pro = procnames->Strings[i];(j=0;j<7;j++)

{= new HCOUNTER;s=AnsiString("\\\\"+AnsiString(ComputerName)+"\\Process("+pro+")\\"+AnsiString(StrCounters[j]));(hQuery, s.c_str(), 0, pCounter);->Objects[2+j][i+1] = (TObject*)pCounter;

}

}

}_STATUS pdhStatus= 0;(hQuery);(i=0; i < procnames->Count; i++)

{->Cells[0][i+1]=i+1;->Cells[1][i+1]=procnames->Strings[i];(j=2;j<9;j++)

{(j<7)

{(j==6)

{( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);->Cells[j][i+1]=(unsigned long int)(fmtValue.doubleValue);

}

{=PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);(pdhStatus==PDH_INVALID_DATA)

{(hQuery);( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);

}->Cells[j][i+1]= fmtValue.doubleValue;

}

}

{( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);->Cells[j][i+1]= (unsigned long int)(fmtValue.doubleValue)/1024;

}

}

}->RowCount=procnames->Count + 1;

}__fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,ARow, bool &CanSelect)

{=ARow;

}__fastcall TForm1::Button2Click(TObject *Sender)

{();

}__fastcall TForm1::Button1Click(TObject *Sender)

{l;=StrToInt(StringGrid1->Cells[2][c]);=OpenProcess (PROCESS_TERMINATE,true,b);(l,0);(l);

}

Похожие работы на - Разработка электронного приложения 'Инспектор процессов и потоков'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!