Разработка электронного приложения "Инспектор процессов и потоков"
Разработка программного кода. Анализ набора функций, необходимых для реализации приложения. Создание компонента Timer. Получение списка имен процессов запущенных на локальном компьютере. Проверка правильности работы программы и соответствия требованиям.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 05.01.2013 |
Размер файла | 2,3 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://allbest.ru/
Аннотация
Цель курсовой работы - разработать электронное приложение «инспектор процессов и потоков».
Исходя из цели курсовой работы, была освоена предметная область, соответствующая задаче, а так же язык программирования Си++. Интерфейс разработанной программы представлен в виде окна, состоящего из имен процессов локального компьютера, а также имен счётчиков производительности, в котором отображается результат их работы.
Разработанное электронное приложение может быть полезным для всех пользователей персонального компьютера, у которых есть необходимость в получении информации о том или ином процессе или о всех процессах в целом.
Была произведена апробация на нескольких учебных компьютерах, которая показала, что использование электронного приложения в среде С++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.
Проектирование
программный код локальный компьютер
Задача проектирования была разбита на несколько этапов:
1. Получение имени локального компьютера, на котором запущено приложение и создание запроса, который будет управлять собранными данными производительности процессов
2. Создание компонента Timer. В его обработчик события помещается основной код программы
3. Получение списка имен процессов запущенных на локальном компьютере
4. Удаление в имени процесса разрешения «exe»
5. Добавление порядкового номера к повторяющемуся имени процесса
6. Собрание необработанных значений данных для всех счетчиков в указанном запросе
После двух срабатываний таймера приложение заново составит список имен запушенных процессов и далее будет работать по вышеописанному алгоритму, но перед этим очистит список.
Для реализации выше описанного алгоритма необходимо создать на главной форме поле с использованием компонента StringGrid, которое представляет собой таблицу, содержащую строки. Это поле будет автоматически заполняться полученной информацией о счетчиках процессов и именами процессов локального компьютера. Также необходимо, чтобы эта информация постоянно обновлялась.
Так же на поле формы помещаем две кнопки с именами «Button1» и «Button2».
Кнопка «Button1» нужна для завершения выбранного пользователем процесса, а кнопка «Button2» для выхода и завершения работы приложения.
Помимо на форму помещается компонент класса TTimer с именем «Timer1»:
Этот компонент нужен для организации обновления значения счетчиков.
Рис.1.1 Главная форма приложения (Form1)
Кодировка и отладка
Целью данного этапа является программная реализация проектных решений, полученных на этапе проектирования, т.е. создание работоспособного программного продукта. Для реализации проекта выбран язык С++Builder 6.0, а так же воспользуемся функциями библиотек Tool Help Library (THL) и Performance Data Helper (PDH)
Рассмотрим подробно каждый этап:
1. Получение снимка всех процессов
Для получения списка запущенных процессов необходимо инициализировать структуру PROCESSENTRY32:
typedef struct tagPROCESSENTRY32 {
DWORD dwSize; Размер струтуры в байтах
DWORD cntUsage;
DWORD th32ProcessID; Идентификатор процесса
DWORD th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads; Число потоков в процессе
DWORD th32ParentProcessID; Идентификатор родительского процесса
LONG pcPriClassBase; Базовый приоритет какого-либо потока процесса
DWORD dwFlags;
TCHAR szExeFile[MAX_PATH]; Имя исполняемого процесса
DWORD th32MemoryBase;
DWORD th32AccessKey;
PROCESSENTRY32;
typedef PROCESSENTRY32* PPROCESSENTRY32;
Для использования данной функции необходимо подключить библиотеку tlhelp32.
Затем вызывается функция
HANDLE WINAPI CreateToolhelp32Snapshot (DWORD dwFlags,
DWORD th32ProcessID).
Первый параметр dwFlags - определяет тип моментального снимка и указывает, какая именно информация интересует пользователя. В курсовом проекте используется значение TH32CS_SNAPPROCESS позволяющее получить список запущенных на локальном компьютере процессов.
Второй параметр th32ProcessID , указывает идентификатор процесса, для которого будет создаваться моментальный снимок Этот параметр в курсовом проекте устанавливаем NULL.
2. Извлечение информации о первом процессе, записанном в снимок
Будем использовать функцию Process32First
BOOL WINAPI Process32First (HANDLE hSnapshot, LPPROCESSENTRY32 lppe).
Данная функция возвращает TRUE, в случае успеха получения информации о первом процессе из снимка процессов и FALSE в обратном случае. Заполняет структуру lppe необходимой информацией о первом процессе из снимка, сделанного функцией CreateToolhelp32Snapshot.
3. Извлечение информации о других процессах, записанных в снимок
Будем использовать функцию Process32Next
BOOL WINAPI Process32Next(HANDLE hSnapshot, LPPROCESSENTRY32 lppe).
Данная функция извлекает информацию о следующем процессе.
Первый параметр hSnapshot - дескриптор снимка, возвращаемый от предыдущего вызова функции СreateToolhelp32Snapshot.
Второй параметр lppe - адрес структуры PROCESSENTRY32.
Перед вызовом функции Process32First необходимо установить в поле dwSize структуры PROCESSENTRY32 значение, которое равно размеру самой структуры sizeof(PROCESSENTRY32), иначе функция возвращает ошибку.
4. Сортировка полученного списка
На данном этапе отслеживается появление разрешения «exe» в имени процесса, а затем удаляется.
5. Получение порядкового номера для процессов с одинаковыми именами
В списке попадаются процессы с одинаковым именем, к повторяющемуся имени добавляется «#порядковый номер».
6. Получение имени локального компьютера
Используем функцию BOOL WINAPI GetComputerName( LPTSTR lpBuffer, LPDWORD lpnSize).
Первый параметр lpBuffer - указатель на буфер, который получает сетевое имя или кластерное виртуальное имя сервера.
Второй параметр lpnSize - определяет размер требуемого буфера, включая закончившийся нулевой символ.
7. Создание запроса
Для создания нового запроса, который будет использоваться, чтобы управлять собранными данными производительности будем использовать функцию
PDH_STATUS PdhOpenQuery(LPCTSTR szDataSource,
DWORD_PTR dwUserData,
PDH_HQUERY *phQuery).
Первый параметр szDataSource - строка, которая определяет имя файла журнала, из которого извлекаются данные о производительности. If NULL, performance data is collected from a real-time data source. Если NULL, данные о производительности собираются из источника данных в реальном времени.
Второй параметр dwUserData - определяемое пользователем значение, связанное с этим запросом. В нашем случае NULL.
8. Добавление счетчика к запросу
При помощи функции PdhAddCounter добавляется счетчик к запросу, сделанному с помощью функции PdhOpenQuery.
PDH_STATUS PdhAddCounter ( PDH_HQUERY hQuery,
LPCTSTR szFullCounterPath,
DWORD_PTR dwUserData,
PDH_HCOUNTER *phCounter).
Первый параметр hQuery - Дескриптор запроса Этот дескриптор возвращен функцией PdhOpenQuery.
Второй параметр szFullCounterPath - строка с нулевым символом в конце, которая содержит путь счетчика.
Третий параметр dwUserData - определяемое пользователем значение. Это значение становится частью информацией счетчика. В нашем приложении NULL.
Четвертый параметр phCounter - дескриптор на счетчик, который был добавлен к запросу. Будем ссылаться на этот дескриптор в последующих запросах.
9. Собрание всех текущих необработанных значений данных для всех счетчиков в указанном запросе
Делаем это с помощью функции
PDH_STATUS PdhCollectQueryData(PDH_HQUERY hQuery).
Параметр hQuery - дескриптор запроса, для которого хотим собрать данные. Функция PdhOpenQuery возвращает этот дескриптор.
10. Получение информации для указанного счетчика
Получаем информацию для указанного счетчика с помощью
PDH_STATUS PdhGetFormattedCounterValue(PDH_HCOUNTER hCounter,
DWORD dwFormat,
LPDWORD lpdwType,
PPDH_FMT_COUNTERVALUE pValue).
Первый параметр hCounter - дескриптор счетчика, для которого хотим получить информацию. Функция PdhAddCounter возвращает этот дескриптор.
Второй параметр dwFormat- определяет тип данных отформатированного значения. В приложении используем значение PDH_FMT_DOUBLE.
Третий параметр lpdwType- этот параметр является дополнительным. В нашем случае устанавливаем NULL.
Четвертый параметр pValue - структура PDH_FMT_COUNTERVALUE, которая получает значение счетчика.
11. Обновление списка запущенных процессов
Для этого надо сначала удалить счетчики из запроса это делаем функцией
PDH_STATUS PdhRemoveCounter (PDH_HCOUNTER hCounter).
Две следующие функции потребуются для завершения выделенного процесса в таблице. Это функция
HANDLE OpenProcess (DWORD dwDesiredAccess,
BOOL bIn-heritHandle,
DWORD 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.4 Диспетчер задач Windows
Как видно на рис 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)
2. П.В. Гришмановский, И.Н. Даниленко. - Курсовое проектирование. Разработка программного обеспечения. Методические указания к выполнению курсовых проектов для студентов специальностей 210100 «Управление и информатика в технических системах» и 220400 «Программное обеспечение вычислительной техники и автоматизированных систем». Сургут: Издательство СурГУ, 2004. - 23с
3. Таненбаум Э. «Современные Операционные системы»
Приложения
Приложение А
Программный код заголовочного файла 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>
class TForm1 : public TForm
{
__published:// IDE-managed Components
TButton *Button1;
TButton *Button2;
TStringGrid *StringGrid1;
TTimer *Timer1;
void __fastcall Timer1Timer(TObject *Sender);
void __fastcall StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
private:// User declarations
PDH_FMT_COUNTERVALUE fmtValue;
char computername[MAX_COMPUTERNAME_LENGTH];
unsigned long size;
TStringList * procnames;
public:// User declarations
__fastcall TForm1(TComponent* Owner);
HQUERY hQuery;
};
extern 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"
TForm1 *Form1;
int b,c,i,j,a=0;
char StrCounters[7][30]={"Идентификатор процесса",
"Базовый приоритет",
"Счетчик потоков",
"Код (ID) создавшего процесса",
"% загруженности процессора",
"Байт виртуальной памяти",
"Байт файла подкачки"};
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
procnames = new TStringList;
size = MAX_COMPUTERNAME_LENGTH;
StringGrid1->Cells[0][0]="№";
StringGrid1->Cells[1][0]="Имя образа";
StringGrid1->Cells[2][0]="PID";
StringGrid1->Cells[3][0]="Приоритет";
StringGrid1->Cells[4][0]="Кол-во потоков";
StringGrid1->Cells[5][0]="PID родителя";
StringGrid1->Cells[6][0]="Загр. процесса" ;
StringGrid1->Cells[7][0]="Вирт. память" ;
StringGrid1->Cells[8][0]="Память подк." ;
GetComputerName(computername,&size);
PdhOpenQuery(NULL, NULL, &hQuery);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
{
HANDLE h;
PROCESSENTRY32 p;
p.dwSize = sizeof(PROCESSENTRY32);
h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (a==1)
{
procnames->Clear();
for (j=1;j<StrToInt(StringGrid1->RowCount);j++)
{
for (i=2;i<9;i++)
{
PdhRemoveCounter (*(HCOUNTER*)(StringGrid1->Objects[i][j]));
delete (HCOUNTER*)(StringGrid1->Objects[i][j]);
}
}
}
a=1;
if(Process32First(h,&p))
{
do
{
procnames->Add(p.szExeFile);
}
while(Process32Next(h,&p));
}
procnames->Sort();
for(i=0; i < procnames->Count; i = j)
{
AnsiString name= procnames->Strings[i].SubString(procnames->Strings[i].Length()-2,3);
if (name == AnsiString("exe")||name == AnsiString("EXE"))
{
for(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )
{
procnames->Strings[j]= procnames->Strings[j].SubString(1,procnames->Strings[j].Length()-4);
procnames->Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);
}
procnames->Strings[i]= procnames->Strings[i].SubString(1,procnames->Strings[i].Length()-4);
}
else
{
for(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )
{
procnames->Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);
}
if (procnames->Strings[i]=="[System Process]")
procnames->Strings[i]="_Total" ;
}
}
HCOUNTER * pCounter;
for(i=0; i < procnames->Count; i++)
{
AnsiString pro = procnames->Strings[i];
for (j=0;j<7;j++)
{
pCounter = new HCOUNTER;
AnsiString s=AnsiString("\\\\"+AnsiString(ComputerName)+"\\Процесс("+pro+")\\"+AnsiString(StrCounters[j]));
PdhAddCounter (hQuery, s.c_str(), 0, pCounter);
StringGrid1->Objects[2+j][i+1] = (TObject*)pCounter;
}
}
}
g++;
PDH_STATUS pdhStatus= 0;
PdhCollectQueryData (hQuery);
for(i=0; i < procnames->Count; i++)
{
StringGrid1->Cells[0][i+1]=i+1;
StringGrid1->Cells[1][i+1]=procnames->Strings[i];
for (j=2;j<9;j++)
{
if (j<7)
{
if (j==6)
{
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
StringGrid1->Cells[j][i+1]=(unsigned long int)(fmtValue.doubleValue);
}
else
{
pdhStatus=PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
if(pdhStatus==PDH_INVALID_DATA)
{
PdhCollectQueryData (hQuery);
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
}
StringGrid1->Cells[j][i+1]= fmtValue.doubleValue;
}
}
else
{
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
StringGrid1->Cells[j][i+1]= (unsigned long int)(fmtValue.doubleValue)/1024;
}
}
}
StringGrid1->RowCount=procnames->Count + 1;
}
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
c=ARow;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE l;
b=StrToInt(StringGrid1->Cells[2][c]);
l=OpenProcess (PROCESS_TERMINATE,true,b);
TerminateProcess(l,0);
CloseHandle(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"
TForm1 *Form1;
int b,c,i,j,a=0;
char StrCounters[7][30]={"ID Process",
"Priority Base",
"Thread Count",
"1410
"% Processor Time",
"Virtual Bytes",
"Page File Bytes"};
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
procnames = new TStringList;
size = MAX_COMPUTERNAME_LENGTH;
StringGrid1->Cells[0][0]="№";
StringGrid1->Cells[1][0]="Имя образа";
StringGrid1->Cells[2][0]="PID";
StringGrid1->Cells[3][0]="Приоритет";
StringGrid1->Cells[4][0]="Кол-во потоков";
StringGrid1->Cells[5][0]="PID родителя";
StringGrid1->Cells[6][0]="Загр. процесса" ;
StringGrid1->Cells[7][0]="Вирт. память" ;
StringGrid1->Cells[8][0]="Память подк." ;
GetComputerName(computername,&size);
PdhOpenQuery(NULL, NULL, &hQuery);
}
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
{
HANDLE h;
PROCESSENTRY32 p;
p.dwSize = sizeof(PROCESSENTRY32);
h=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (m==1)
{
procnames->Clear();
for (j=1;j<StrToInt(StringGrid1->RowCount);j++)
{
for (i=2;i<9;i++)
{
PdhRemoveCounter (*(HCOUNTER*)(StringGrid1->Objects[i][j]));
delete (HCOUNTER*)(StringGrid1->Objects[i][j]);
}
}
}
m=1;
if(Process32First(h,&p))
{
do
{
procnames->Add(p.szExeFile);
}
while(Process32Next(h,&p));
}
procnames->Sort();
for(i=0; i < procnames->Count; i = j)
{
AnsiString name= procnames->Strings[i].SubString(procnames->Strings[i].Length()-2,3);
if (name == AnsiString("exe")||name == AnsiString("EXE"))
{
for(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )
{
procnames->Strings[j]= procnames->Strings[j].SubString(1,procnames->Strings[j].Length()-4);
procnames->Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);
}
procnames->Strings[i]= procnames->Strings[i].SubString(1,procnames->Strings[i].Length()-4);
}
else
{
for(j = i+1;j<procnames->Count&&procnames->Strings[i] == procnames->Strings[j]; j++ )
{
procnames->Strings[j]= procnames->Strings[j]+"#"+IntToStr(j-i);
}
if (procnames->Strings[i]=="[System Process]")
procnames->Strings[i]="_Total" ;
}
}
HCOUNTER * pCounter;
for(i=0; i < procnames->Count; i++)
{
AnsiString pro = procnames->Strings[i];
for (j=0;j<7;j++)
{
pCounter = new HCOUNTER;
AnsiString s=AnsiString("\\\\"+AnsiString(ComputerName)+"\\Process("+pro+")\\"+AnsiString(StrCounters[j]));
PdhAddEnglishCounter (hQuery, s.c_str(), 0, pCounter);
StringGrid1->Objects[2+j][i+1] = (TObject*)pCounter;
}
}
}
PDH_STATUS pdhStatus= 0;
PdhCollectQueryData (hQuery);
for(i=0; i < procnames->Count; i++)
{
StringGrid1->Cells[0][i+1]=i+1;
StringGrid1->Cells[1][i+1]=procnames->Strings[i];
for (j=2;j<9;j++)
{
if (j<7)
{
if (j==6)
{
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
StringGrid1->Cells[j][i+1]=(unsigned long int)(fmtValue.doubleValue);
}
else
{
pdhStatus=PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
if(pdhStatus==PDH_INVALID_DATA)
{
PdhCollectQueryData (hQuery);
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
}
StringGrid1->Cells[j][i+1]= fmtValue.doubleValue;
}
}
else
{
PdhGetFormattedCounterValue ( *(HCOUNTER*)(StringGrid1->Objects[j][i+1]), PDH_FMT_DOUBLE, 0, &fmtValue);
StringGrid1->Cells[j][i+1]= (unsigned long int)(fmtValue.doubleValue)/1024;
}
}
}
StringGrid1->RowCount=procnames->Count + 1;
}
void __fastcall TForm1::StringGrid1SelectCell(TObject *Sender, int ACol,
int ARow, bool &CanSelect)
{
c=ARow;
}
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Close();
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
HANDLE l;
b=StrToInt(StringGrid1->Cells[2][c]);
l=OpenProcess (PROCESS_TERMINATE,true,b);
TerminateProcess(l,0);
CloseHandle(l);
}
Размещено на Allbest.ru
Подобные документы
Разработка программного кода и алгоритма действий приложения "калькулятор". Использование функций в программе Matlab. Разработка кнопок, опций, интерфейса, оформление. Части кода Matlab и тестовый набор. Инструкция пользователя по работе программы.
курсовая работа [527,1 K], добавлен 27.09.2014Создание программного приложения для осуществления основных функций по заказу мебели, регистрации клиентов, сотрудничеству с поставщиками. Разработка интерфейса прикладной программы. Логическое проектирование базы данных и SQL-скрипт генерации таблиц.
курсовая работа [2,4 M], добавлен 11.02.2013Общее определение JavaScript-библиотеки, виды библиотек. Создание клиентского приложения с использованием одного из существующий JS-фреймворков. Значение, виды и выбор фреймворка. Выбор приложения и его тематики. Написание программного кода, итоги работы.
курсовая работа [545,8 K], добавлен 21.12.2013Разработка приложения, которое будет выполнять функции показа точного времени и точной даты. Определение дополнительных функций разработанного приложения. Рассмотрение основных этапов создания программного продукта. Результаты тестирования приложения.
курсовая работа [2,2 M], добавлен 14.04.2019Анализ технических средств и современных технологий разработки программного обеспечения. Разработка программы для упрощения поиска студентов. Создание учетных записей администратора и обычного пользователя. Изучение правил построения программного кода.
курсовая работа [1,9 M], добавлен 30.09.2016Спецификация требований к разрабатываемому приложению. Разработка структурной схемы интерфейса. Описание алгоритма шифрования DES. Разработка программного кода приложения "DES". Проведение исследования основных шагов для генерации ключей и шифрования.
курсовая работа [398,4 K], добавлен 13.12.2022Анализ целевой аудитории. Функциональные характеристики пользовательского приложения. Разработка алгоритмов и интерфейса программного продукта, функций рабочей области. Написание скриптов на языке C#. Тестирование программы методом чёрного ящика.
дипломная работа [1,5 M], добавлен 09.11.2016Структура программы в среде Delphi в процессе проектирования приложения, ее модульный принцип. Объявление списка используемых модулей и нескольких операторов. Размещение на форме компонентов и изменение их свойств. Создание кода - обработчика события.
лабораторная работа [19,1 K], добавлен 15.07.2009Разработка и реализация демонстрационного многопоточного приложения. Выбор основных средств реализации. Описание логики работы приложения и разработка программного обеспечения. Описание пользовательского интерфейса. Реализация потоков в Delphi.
курсовая работа [462,5 K], добавлен 10.08.2014Создание приложения, исполняющего трансляцию программы из языка Паскаль в язык Си: разработка алгоритма реализации задачи, описание необходимых констант, переменных, функций и операторов, представление листинга программы и распечатка результатов.
курсовая работа [305,9 K], добавлен 03.07.2011