Как написать свой диспетчер задач

На чтение 20 мин Просмотров 1.7к. Опубликовано 08.07.2021

В этой статье мы собираемся создать программное обеспечение для управления задачами на Python. Это программное обеспечение будет очень полезно для тех, кто не хочет обременять себя тем, какую задачу они выполнили, а с какой остались. Как программист, мы должны помнить, какие соревнования проходят, на какие курсы мы записываемся, за каким плейлистом YouTube следим и так далее. Это программное обеспечение будет вести учет всех таких деталей в безопасном режиме, чтобы только вы имели доступ к вашим данным.

Инструменты и технологии, использованные в проекте:

  • Этот проект будет очень удобным для новичков.
  • Работа этого программного обеспечения полностью основана на протоколе POP (процедурно-ориентированное программирование). Требуются базовые знания о функциях Python.
  • Модуль DateTime в Python.

Требуемый набор навыков для создания проекта:

  • Python
  • Visual Studio Code или любой другой редактор кода.

Содержание

  1. Пошаговая реализация
  2. Шаг 1.Создайте папку с именем «Диспетчер задач». Откройте его в своем любимом редакторе кода.
  3. Шаг 2.Создайте файл Python с именем task_manager.py.
  4. Шаг 3:Теперь мы готовы написать код нашего программного обеспечения.
  5. Шаг 4:Теперь мы создадим функцию user_information
  6. Шаг 5:После того, как текстовый файл будет создан функцией user_information.
  7. Шаг 6: На этом шаге мы позаботимся о том, чтобы после входа пользователя в систему мы могли попросить его / ее войти в свою учетную запись.
  8. Шаг 7: Давайте выполним четыре важные функции, упомянутые в блоке «вход».
  9. Шаг 8: Давайте закодируем блок данных представления.
  10. Шаг 9: Чтобы закодировать информационный блок задачи, нам нужно помнить об основных концепциях обработки текста в Python.
  11. Шаг 10: Обновление статуса задачи происходит в аналогичной концепции обработки текста в Python.
  12. Шаг 11: Теперь у нас осталась функция просмотра обновлений задач.
  13. Шаг 12: Основная функция.

Пошаговая реализация

Выполните следующие шаги, чтобы реализовать персонализированный диспетчер задач с использованием Python:

Шаг 1.Создайте папку с именем «Диспетчер задач». Откройте его в своем любимом редакторе кода.

Шаг 2.Создайте файл Python с именем task_manager.py.

Шаг 3:Теперь мы готовы написать код нашего программного обеспечения.

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

def signup():

    print("Please enter the username by which you

    wanna access your account")

    username = input("please enter here:  ")

    password = input("Enter a password:  ")

Шаг 4:Теперь мы создадим функцию user_information

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

def user_information(ussnm, pssd):

    name = input("enter your name please: ")

    address = input("your adress")

    age = input("Your age please")

    ussnm_ = ussnm+" task.txt"

    f = open(ussnm_, 'a')

    f.write(pssd)

    f.write("nName: ")

    f.write(name)

    f.write('n')

    f.write("Adress :")

    f.write(address)

    f.write('n')

    f.write("Age :")

    f.write(age)

    f.write('n')

    f.close()

def signup():

    print("Please enter the username by which you

    wanna access your account")

    username = input("please enter here:  ")

    password = input("Enter a password:  ")

    user_information(username, password)

Шаг 5:После того, как текстовый файл будет создан функцией user_information.

Пора закодировать нашу функцию входа в систему. Функция входа в систему будет принимать имя пользователя и запрашивать связанный с ним пароль. Как только пользователь вводит пароль, функция проверяет, совпадает ли пароль, сохраненный в текстовом файле, с введенным. Код может объяснить более точно,

def login():

    print("Please enter your username ")

    user_nm = input("Enter here: ")

    pssd_wr = (input("enterr the password"))+'n'

    try:

        usernm = user_nm+" task.txt"

        f_ = open(usernm, 'r')

        k = f_.readlines(0)[0]

        f_.close()

        if pssd_wr == k:

            print(

                "1--to view your data n2--To add task n3--Update

                task status n4--View task status")

            a = input()

        else:

            print("SIR YOUR PASSWORD OR USERNAME IS WRONG , Plz enter Again")

            login()

    except Exception as e:

        print(e)

        login()

Шаг 6: На этом шаге мы позаботимся о том, чтобы после входа пользователя в систему мы могли попросить его / ее войти в свою учетную запись.

Это можно сделать, вызвав функцию входа в систему в конце функции входа. Следовательно, функция входа будет выглядеть так:
Python3

def signup():

    print("Please enter the username by which you wanna access your account")

    username = input("please enter here:  ")

    password = input("Enter a password:  ")

    user_information(username, password)

    print("Sir please proceed towards log in")

    login()

Шаг 7: Давайте выполним четыре важные функции, упомянутые в блоке «вход».

А именно, функция для просмотра данных, функция для добавления задачи к данным, функция для обновления статуса задачи и функция для просмотра статуса задачи. На этом этапе мы собираемся завершить функцию входа в систему, выполнив часть if-else после ввода запроса пользователя, то есть ввода в переменную a. См. Код ниже:
Python3

def login():

    print("Please enter your username ")

    user_nm = input("Enter here: ")

    pssd_wr = (input("enterr the password"))+'n'

    try:

        usernm = user_nm+" task.txt"

        f_ = open(usernm, 'r')

        k = f_.readlines(0)[0]

        f_.close()

        if pssd_wr == k:

            print(

                "1--to view your data n2--To add task n3--Update

                task n4--VIEW TASK STATUS")

            a = input()

            if a == '1':

                view_data(usernm)

            elif a == '2':

                task_information(usernm)

            elif a == '3':

                task_update(user_nm)

            elif a == '4':

                task_update_viewer(user_nm)

            else:

                print("Wrong input ! ")

        else:

            print("SIR YOUR PASSWORD OR USERNAME IS WRONG")

            login()

    except Exception as e:

        print(e)

        login()

def view_data(username):

    pass

def task_information(username):

    pass

def task_update(username):

    pass

def task_update_viewer(username):

    pass

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

Шаг 8: Давайте закодируем блок данных представления.

def view_data(username):

    ff = open(username, 'r')

    print(ff.read())

    ff.close()

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

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

def task_information(username):

    print("Sir enter n.o of task you want to ADD")

    j = int(input())

    f1 = open(username, 'a')

    for i in range(1, j+1):

        task = input("enter the task")

        target = input("enter the target")

        pp = "TASK "+str(i)+' :'

        qq = "TARGET "+str(i)+" :"

        f1.write(pp)

        f1.write(task)

        f1.write('n')

        f1.write(qq)

        f1.write(target)

        f1.write('n')

        print("Do u want to stop press space bar otherwise enter")

        s = input()

        if s == ' ':

            break

    f1.close()

Обратите внимание, что мы добавили сообщение о том, что если пользователь захочет прекратить добавление задачи раньше того количества раз, которое он хотел, то у него будет шанс. Это делает программу очень удобной для пользователя.

Шаг 10: Обновление статуса задачи происходит в аналогичной концепции обработки текста в Python.

Что мы будем делать, так это сохранить номер задачи, номер которой завершен, которая выполняется, а какая еще не запущена, с отметкой даты и времени с ними. Эта часть текстового файла будет выглядеть так:

2021-06-01 14:44:02.851506
COMPLETED TASK  
1,3,4
ONGOING TASK  
2
NOT YET STARTED
5

def task_update(username):

    username = username+" TASK.txt"

    print("Please enter the tasks which are completed ")

    task_completed = input()

    print("Enter task which are still not started by you")

    task_not_started = input()

    print("Enter task which you are doing")

    task_ongoing = input()

    fw = open(username, 'a')

    DT = str(datetime.datetime.now())

    fw.write(DT)

    fw.write("n")

    fw.write("COMPLETED TASK n")

    fw.write(task_completed)

    fw.write("n")

    fw.write("ONGOING TASK n")

    fw.write(task_ongoing)

    fw.write("n")

    fw.write("NOT YET STARTEDn")

    fw.write(task_not_started)

    fw.write("n")

Шаг 11: Теперь у нас осталась функция просмотра обновлений задач.

Эта функция так же проста, как функция view_data.

def task_update_viewer(username):

    ussnm = username+" TASK.txt"

    o = open(ussnm, 'r')

    print(o.read())

    o.close()

На этом программа завершается. Но прежде чем мы закончим, самая важная задача, которая все еще остается. Это кодирование основной функции и управление потоком команд программы из самой основной функции.

Шаг 12: Основная функция.

if __name__ == '__main__':

    print("WELCOME TO ANURAG`S TASK MANAGER")

    print("sir are you new to this software")

    a = int(input("Type 1 if new otherwise press 0 ::"))

    if a == 1:

        signup()

    elif a == 0:

        login()

    else:

        print("You have provided wrong input !")

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

Исходный код:

import datetime

def user_information(ussnm, pssd): 

    name = input("enter your name please: ")

    address = input("your adress")

    age = input("Your age please")

    ussnm_ = ussnm+" task.txt"

    f = open(ussnm_, 'a')

    f.write(pssd)

    f.write("nName: ")

    f.write(name)

    f.write('n')

    f.write("Adress :")

    f.write(address)

    f.write('n')

    f.write("Age :")

    f.write(age)

    f.write('n')

    f.close()

def signup():

    print("Please enter the username by which you wanna access your account")

    username = input("please enter here:  ")

    password = input("Enter a password:  ")

    user_information(username, password)

    print("Sir please proceed towards log in")

    login()

def login():

    print("Please enter your username ")

    user_nm = input("Enter here: ")

    pssd_wr = (input("enterr the password"))+'n'

    try:

        usernm = user_nm+" task.txt"

        f_ = open(usernm, 'r')

        k = f_.readlines(0)[0]

        f_.close()

        if pssd_wr == k:  

            print(

                "1--to view your data n2--To add task n3--Update

                task n4--VIEW TASK STATUS")

            a = input()

            if a == '1':

                view_data(usernm)

            elif a == '2':

                task_information(usernm)

            elif a == '3':

                task_update(user_nm)

            elif a == '4':

                task_update_viewer(user_nm)

            else:

                print("Wrong input ! bhai dekh kr input dal")

        else:

            print("SIR YOUR PASSWORD OR USERNAME IS WRONG")

            login()

    except Exception as e:

        print(e)

        login()

def view_data(username):

    ff = open(username, 'r')

    print(ff.read())

    ff.close()

def task_information(username):

    print("Sir enter n.o of task you want to ADD")

    j = int(input())

    f1 = open(username, 'a')

    for i in range(1, j+1):

        task = input("enter the task")

        target = input("enter the target")

        pp = "TASK "+str(i)+' :'

        qq = "TARGET "+str(i)+" :"

        f1.write(pp)

        f1.write(task)

        f1.write('n')

        f1.write(qq)

        f1.write(target)

        f1.write('n')

        print("Do u want to stop press space bar otherwise enter")

        s = input()

        if s == ' ':

            break

    f1.close()

def task_update(username):

    username = username+" TASK.txt"

    print("Please enter the tasks which are completed ")

    task_completed = input()

    print("Enter task which are still not started by you")

    task_not_started = input()

    print("Enter task which you are doing")

    task_ongoing = input()

    fw = open(username, 'a')

    DT = str(datetime.datetime.now())

    fw.write(DT)

    fw.write("n")

    fw.write("COMPLETED TASK n")

    fw.write(task_completed)

    fw.write("n")

    fw.write("ONGOING TASK n")

    fw.write(task_ongoing)

    fw.write("n")

    fw.write("NOT YET STARTEDn")

    fw.write(task_not_started)

    fw.write("n")

def task_update_viewer(username):

    ussnm = username+" TASK.txt"

    o = open(ussnm, 'r')

    print(o.read())

    o.close()

if __name__ == '__main__':

    print("WELCOME TO ANURAG`S TASK MANAGER")

    print("sir are you new to this software")

    a = int(input("Type 1 if new otherwise press 0 ::"))

    if a == 1:

        signup()

    elif a == 0:

        login()

    else:

        print("You have provided wrong input !")

Применение проекта в реальной жизни

  • Это очень помогает учащемуся вести учет своей задачи или домашнего задания и крайнего срока их выполнения.
  • Это очень помогает учащимся помнить о том, чему учиться, и о ресурсах.

1 / 1 / 0

Регистрация: 09.06.2013

Сообщений: 35

03.11.2013, 18:46

 [ТС]

13

ну вот так маленько продолжил

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//Менеджер процессов
 
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
 
int main()
{
    // Делаем "снимок" процессов
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FILETIME ftCreation,
             ftExit,
             ftKernel,
             ftUser;
    PROCESSENTRY32 pe;  //хранит информацию о найденом процессе
    if (Process32First(hSnapshot, &pe)) //Поиск первого процесса в снимке
    {
        printf("Name obraz                PID   Kol-vo nitei      Prioritet         PID family");
        printf("========================= ===== ================= ================= ============");
        do  
        {
            if (!pe.th32ProcessID) continue;    // Пропуск [System process]
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, pe.th32ProcessID);    //Получаем дескриптор процесса
            GetProcessTimes(hProcess,&ftCreation,&ftExit,&ftKernel,&ftUser);//получаем системные времена процесса
            char cPriority[18];
            switch (GetPriorityClass(hProcess)) //Получаем приоритет процесса
            {
                case HIGH_PRIORITY_CLASS:
                    strcpy(cPriority, "Vishe srednego");
                    break;
                case IDLE_PRIORITY_CLASS:
                    strcpy(cPriority, "Nizkii");
                    break;
                case NORMAL_PRIORITY_CLASS:
                    strcpy(cPriority, "Srednii");
                    break;
                case REALTIME_PRIORITY_CLASS:
                    strcpy(cPriority, "Realnogo vremeni");
                    break;
                default:
                    strcpy(cPriority, "Visokii");
            }
            CloseHandle(hProcess);
            //Выводим информацию о процессе
            printf("%25s%6d%18d%18s%12dn", pe.szExeFile, pe.th32ProcessID,
                   pe.cntUsage, cPriority, pe.th32ParentProcessID);
            
        }
        while (Process32Next(hSnapshot, &pe));  //Поиск следущего процесса в снимке
    }
    else printf("Ne poluchilos' poluchit' informaciu");
    CloseHandle(hSnapshot);
    system("PAUSE");
    return 0;
    getch();
}                                                                                                                                   //setprocessworkingsetsize (getcurrentprocess, $ffffffff, $ffffffff);

вот я правильно воспользовался GetProcessTimes?т.е теперь мне необходимо взять ftUser и поделить на ftKernel и домножить на 100 чтобы получить загрузку процесса но перед этим «перевести» время?

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
//Менеджер процессов
 
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    // Делаем "снимок" процессов
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    FILETIME ftCreation,
             ftExit,
             ftKernel,
             ftUser;
    SYSTEMTIME stCreation,
               stExit,
               stKernel,
               stUser;
    PROCESSENTRY32 pe;  //хранит информацию о найденом процессе
    if (Process32First(hSnapshot, &pe)) //Поиск первого процесса в снимке
    {
        printf("Name obraz                PID   Kol-vo nitei      Prioritet         PID family");
        printf("========================= ===== ================= ================= ============");
        do  
        {
            if (!pe.th32ProcessID) continue;    // Пропуск [System process]
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
                                   PROCESS_VM_READ,
                                   FALSE, pe.th32ProcessID);    //Получаем дескриптор процесса
            GetProcessTimes(hProcess,&ftCreation,&ftExit,&ftKernel,&ftUser);//получаем системные времена процесса
            /////
            FileTimeToSystemTime(&ftCreation, &stCreation);
            FileTimeToSystemTime(&ftExit, &stExit);
            FileTimeToSystemTime(&ftUser, &stUser);
            FileTimeToSystemTime(&ftKernel, &stKernel); 
//            cout<<"creation time   -> "<<stCreation.wHour<<" Hour "<<stCreation.wMinute<<" Min "
//                <<stCreation.wSecond<<" Sec "<<stCreation.wMilliseconds<<" mSec "<<endl; 
            int now=((double)stUser.wHour*3600.0+
                    (double)stUser.wMinute*60.0+
                    (double)stUser.wSecond+
                    (double)stUser.wMilliseconds)/1000.0;
            int noq=((double)stKernel.wHour*3600.0+
                    (double)stKernel.wMinute*60.0+
                    (double)stKernel.wSecond+
                    (double)stKernel.wMilliseconds)/1000.0;
            cout<<"->"<<now<<"  ->"<<noq<<endl;
            //float cpu=(now/noq)*100;
            //cout<<"->"<<cpu<<endl;
            /////
            //int MS = ((*((ULONGLONG*)&ftUser)) / (*((ULONGLONG*)&ftKernel)))*100;
            char cPriority[18];
            switch (GetPriorityClass(hProcess)) //Получаем приоритет процесса
            {
                case HIGH_PRIORITY_CLASS:
                    strcpy(cPriority, "Vishe srednego");
                    break;
                case IDLE_PRIORITY_CLASS:
                    strcpy(cPriority, "Nizkii");
                    break;
                case NORMAL_PRIORITY_CLASS:
                    strcpy(cPriority, "Srednii");
                    break;
                case REALTIME_PRIORITY_CLASS:
                    strcpy(cPriority, "Realnogo vremeni");
                    break;
                default:
                    strcpy(cPriority, "Visokii");
            }
            CloseHandle(hProcess);
            //Выводим информацию о процессе
            printf("%25s%6d%18d%18s%12dn", pe.szExeFile, pe.th32ProcessID,
                   pe.cntUsage, cPriority, pe.th32ParentProcessID);         
        }
        while (Process32Next(hSnapshot, &pe));  //Поиск следущего процесса в снимке
    }
    else printf("Ne poluchilos' poluchit' informaciu");
    CloseHandle(hSnapshot);
    system("PAUSE");
    return 0;
    getch();
}



0



  • Download source — 263.7 KB

Introduction

All people who are working on any version of the Windows operating system know about Task Manager. They might be using it very frequently to start, end or manage processes. Task Manager has been around for a long time and is commonly used in our daily work. However, it is still lacking some features which might be useful in certain situations. So, I designed this application to provide features which are not present in the built-in Windows Task Manager. This application was created in VS.NET 2003 using C# and Windows Forms.

In this article, I will first explain some features present in the application, and then I will discuss its design and coding.

Task Manager features

This application…

  • Displays all processes running in your system
  • Allows you to add and remove any process (task) on your local machine
  • Highlights current executing processes
  • Enables connection to any machine and displays its process list
  • Allows you to set or get the priority of any process running on your local machine
  • Enables monitoring of .NET CLR managed memory

Creating the application

First, create a new Windows Application in VS.NET 2003 using C# and name it CustomizedTaskManager. Then design the main start-up form as shown below:

Image 1

I placed a tab control with two tab pages. One is used to display Task Manager and the other to display CLR memory statistics. Then I placed a ListView control on first tab page where all processes and their details are displayed. I added columns like «process name,» «process id,» etc. to the ListView. Then I added MainMenu to provide following options:

  1. To popup «Connect to remote machine» dialog
  2. To popup «Create new task window»
  3. To control highlighting of currently executing processes
  4. To end a selected process
  5. To exit the application

Add a performance counter component from toolbox and set its CategoryName as .NET CLR Memory and its instanceName as aspnet_wp. You can keep instanceName as the first 15 characters in any .NET-managed application’s name. Add appropriate labels to tabpage2 as shown in the figure:

Image 2

Then add another form, naming it frmnewprcdetails, and design it as shown:

Image 3

To minimize coding, I am using this form both to display dialog for connecting to a remote machine and to add new task functionality. These are the namespaces I used in Form1:

System.Diagnostics
System.Threading

Initially, I thought of displaying all processes in ListView and updating their details every second using the Threading.Timer object. However, if we update like that for every second by clearing all ListView items and reloading with new details, it will produce a flicker on the form for every reload. So, in order to avoid that problem, I used a hash table. The logic is outlined in the following section.

Design logic

Task functionality

All processes are loaded when the form loads. I’ve created a timer object with a one second interval to call LoadAllProcesses(). In this method, first I am storing all currently running process’ details in a hash table using Process.GetProcesses(machinename). Then I am comparing the hash table contents with each item present in ListView and if its process ID matches in both the hash table and ListView then we will update its details (i.e. processor time, number of threads) and set the ListView item’s color to red if its processor time or memory usage is changed.

If any new process is created, then the count of the ListView and HashTable items will not be equal. Based on this condition, I am adding an item to the ListView control from the hash table’s contents whose process ID is not present in the ListView control.

If any process has ended, then I am removing that item from ListView by using the ended process’ ID. We can get the ended process’ ID by finding the items that are present in ListView but not in the current process list (hash table).

In this way, it will update all process details in the ListView control every second without any flicker. In order to create a new task, I am getting the user-selected task’s path via the frmnewprcdetails form. We will create that process by calling Process.Start(taskname,arguments).

Then I am providing functionality to end selected processes by calling Process.GetProcessById(selectedprocessid,machinename).Kill().

Remote connection

In order to load a remote machine’s process list, you must have administrative rights or equivalent on that remote machine. I am providing a remote machine’s process load by setting mcname to the selected machine’s IP address from the «Connect to remote machine» dialog. After getting the IP address, I am reloading ListView with the remote machine’s process list.

Priority

We can get and set the priority of any running process from the context menu control. In the context menu, Set Priority will first make a check mark on the correct MenuItem based on its priority. After the context menu pops up, we can change its priority by clicking the appropriate MenuItem. In the status bar, I am displaying the total count of processes and threads in each panel.

Memory

In tabpage2 I am displaying CLR memory details such as heap size. Some applications won’t run fast if their objects are not garbage-collected properly. This will help us to see the total heap size and what the share percentage is between Gen 0, Gen 1, and Gen 2 objects. This will help us to know whether our application is running slow because of insufficient CLR memory. This will also help us make the decision of whether or not to call Garbage Collector explicitly in our application code.

Options

I’ve added the features «Always on top» and «Hide when minimized» to the Options menu. I’ve also added NotifyIcon to show/hide Task Manager.

The final output will look something like this:

Image 4

Image 5

Conclusion

We can still enhance this application by providing more performance counters for processors, ASP.NET applications, good UIs, etc. Please see the article download for further reference. I hope this code will be useful to all.

History

  • May 9, 2007 — Original version posted

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

  • Download source — 263.7 KB

Introduction

All people who are working on any version of the Windows operating system know about Task Manager. They might be using it very frequently to start, end or manage processes. Task Manager has been around for a long time and is commonly used in our daily work. However, it is still lacking some features which might be useful in certain situations. So, I designed this application to provide features which are not present in the built-in Windows Task Manager. This application was created in VS.NET 2003 using C# and Windows Forms.

In this article, I will first explain some features present in the application, and then I will discuss its design and coding.

Task Manager features

This application…

  • Displays all processes running in your system
  • Allows you to add and remove any process (task) on your local machine
  • Highlights current executing processes
  • Enables connection to any machine and displays its process list
  • Allows you to set or get the priority of any process running on your local machine
  • Enables monitoring of .NET CLR managed memory

Creating the application

First, create a new Windows Application in VS.NET 2003 using C# and name it CustomizedTaskManager. Then design the main start-up form as shown below:

Image 1

I placed a tab control with two tab pages. One is used to display Task Manager and the other to display CLR memory statistics. Then I placed a ListView control on first tab page where all processes and their details are displayed. I added columns like «process name,» «process id,» etc. to the ListView. Then I added MainMenu to provide following options:

  1. To popup «Connect to remote machine» dialog
  2. To popup «Create new task window»
  3. To control highlighting of currently executing processes
  4. To end a selected process
  5. To exit the application

Add a performance counter component from toolbox and set its CategoryName as .NET CLR Memory and its instanceName as aspnet_wp. You can keep instanceName as the first 15 characters in any .NET-managed application’s name. Add appropriate labels to tabpage2 as shown in the figure:

Image 2

Then add another form, naming it frmnewprcdetails, and design it as shown:

Image 3

To minimize coding, I am using this form both to display dialog for connecting to a remote machine and to add new task functionality. These are the namespaces I used in Form1:

System.Diagnostics
System.Threading

Initially, I thought of displaying all processes in ListView and updating their details every second using the Threading.Timer object. However, if we update like that for every second by clearing all ListView items and reloading with new details, it will produce a flicker on the form for every reload. So, in order to avoid that problem, I used a hash table. The logic is outlined in the following section.

Design logic

Task functionality

All processes are loaded when the form loads. I’ve created a timer object with a one second interval to call LoadAllProcesses(). In this method, first I am storing all currently running process’ details in a hash table using Process.GetProcesses(machinename). Then I am comparing the hash table contents with each item present in ListView and if its process ID matches in both the hash table and ListView then we will update its details (i.e. processor time, number of threads) and set the ListView item’s color to red if its processor time or memory usage is changed.

If any new process is created, then the count of the ListView and HashTable items will not be equal. Based on this condition, I am adding an item to the ListView control from the hash table’s contents whose process ID is not present in the ListView control.

If any process has ended, then I am removing that item from ListView by using the ended process’ ID. We can get the ended process’ ID by finding the items that are present in ListView but not in the current process list (hash table).

In this way, it will update all process details in the ListView control every second without any flicker. In order to create a new task, I am getting the user-selected task’s path via the frmnewprcdetails form. We will create that process by calling Process.Start(taskname,arguments).

Then I am providing functionality to end selected processes by calling Process.GetProcessById(selectedprocessid,machinename).Kill().

Remote connection

In order to load a remote machine’s process list, you must have administrative rights or equivalent on that remote machine. I am providing a remote machine’s process load by setting mcname to the selected machine’s IP address from the «Connect to remote machine» dialog. After getting the IP address, I am reloading ListView with the remote machine’s process list.

Priority

We can get and set the priority of any running process from the context menu control. In the context menu, Set Priority will first make a check mark on the correct MenuItem based on its priority. After the context menu pops up, we can change its priority by clicking the appropriate MenuItem. In the status bar, I am displaying the total count of processes and threads in each panel.

Memory

In tabpage2 I am displaying CLR memory details such as heap size. Some applications won’t run fast if their objects are not garbage-collected properly. This will help us to see the total heap size and what the share percentage is between Gen 0, Gen 1, and Gen 2 objects. This will help us to know whether our application is running slow because of insufficient CLR memory. This will also help us make the decision of whether or not to call Garbage Collector explicitly in our application code.

Options

I’ve added the features «Always on top» and «Hide when minimized» to the Options menu. I’ve also added NotifyIcon to show/hide Task Manager.

The final output will look something like this:

Image 4

Image 5

Conclusion

We can still enhance this application by providing more performance counters for processors, ASP.NET applications, good UIs, etc. Please see the article download for further reference. I hope this code will be useful to all.

History

  • May 9, 2007 — Original version posted

This member has not yet provided a Biography. Assume it’s interesting and varied, and probably something to do with programming.

Только недавно делал такое, правда в контексте поиска процесса с заданным именем файла. Имеется некоторая проблема — код написан на C++17.

#include <functional>
#include <iostream>
#include <windows.h>
#include <psapi.h>

using PIDVector=vector<DWORD>;
using HMODULEVector=vector<HMODULE>;
template<typename T> bool autoFill(T& vec,std::function<WINBOOL(typename T::value_type*, DWORD, DWORD*)> filler)
{
    //вычисляем размер одного элемента массива
    constexpr auto itmSize=sizeof(typename T::value_type);
    while(true)
    {
        DWORD cnt;
        const auto status=filler(vec.data(), vec.size()*itmSize, &cnt);
        if(!status)
        {
            //в случае ошибки, выходим
            return false;
        }

        //нам приходит размер данных в байтах, а нужно - в штуках
        const auto nItems=cnt/itmSize; 

        if(nItems>=vec.size())
        {
            //если буфер мал - увеличить
            vec.resize( nItems + 1024);
        }
        else
        {
            vec.resize( nItems );
            return true;
        }
    }
}

void findProcess()
{
    const auto fName=procName.toUpper();   

    PIDVector pids(1024);
    //вызываем заполнялку первый раз, в качестве функции-заполнителя выступает EnumProcesses
    if(!autoFill<PIDVector>(pids, &EnumProcesses))
    {
        return;
    }

    wcout << pids.size() << L" processes found";


    for(const auto& i:pids)
    {    
        const auto cur=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,i);

        if(!cur)
        {
            lout.fail();
            continue;
        }


        wstring name;
        //второй раз сложнее - GetProcessImageFileNameW работает по тому же шаблону, что и EnumProcesses, но аргументы принимает иначе
        //справляемся с этим, затолкав ее в адаптер из функтора
        autoFill(name,[cur](wchar_t* str,DWORD size,DWORD* needed)
                         {
                             *needed=GetProcessImageFileNameW(cur,str,size/sizeof(wchar_t))*sizeof(wchar_t);

                             return TRUE;
                         }
                );    
        wcout << name;
    }
    return;
}

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

  • вызывать
  • проверить, что функции хватило буфера
  • если нехватило, повторить

Чтобы не писать два раза идентичный по форме код, я сочинил шаблон.

Мне нужно сделать диспетчер задач: Вывод процессов, убиение процессов, открыть новый процесс.
Какие функции нужны???
Зарание благодарен.

10 ответов

51K

02 декабря 2009 года

Crypt1c

5 / / 09.09.2009

Я новичёк. А как можно сделать чтобы процессы выводились в ListView?
Если можно то поподробнее.

288

03 декабря 2009 года

nikitozz

1.2K / / 09.03.2007

Код:

foreach (Process process in Process.GetProcesses())
{
    listView1.Items.Add(process.ProcessName);
}

51K

04 декабря 2009 года

Crypt1c

5 / / 09.09.2009

Большое спасибо! Может у кого есть исходник диспетчера на C#?

5

04 декабря 2009 года

hardcase

4.5K / / 09.08.2005

Большое спасибо! Может у кого есть исходник диспетчера на C#?

Ты уж определись, готовый исходник тебе или «алгоритм» работы. :D

1

04 декабря 2009 года

kot_

7.3K / / 20.01.2000

И хороооооооошо подумай с ответом. :)

51K

04 декабря 2009 года

Crypt1c

5 / / 09.09.2009

Я спрашивал может есть у кого исходник, зачем мне делать то ,что давно уже сделано?

1

04 декабря 2009 года

kot_

7.3K / / 20.01.2000

Я же сказал. Хорошо подумай. И прости правила прежде чем что либо писать.

7

27 августа 2013 года

@pixo $oft

3.4K / / 20.09.2006

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

#include <windows.h> #include <windowsX.h> #include «resource.h» #include <iostream> #include <tchar.h> #include <windows.h> #include <Tlhelp32.h> #include <conio.h> #include <commctrl.h> #include <stdio.h> #pragma comment(lib, «gdi32.lib») #pragma comment(lib, «comctl32.lib») #pragma comment(linker, «»/manifestdependency:type=’win32′ name = ‘Microsoft.Windows.Common-Controls’ version = ‘6.0.0.0’ processorArchitecture = ‘*’ publicKeyToken=’6595b64144ccf1df’ language=’*'»») wchar_t* str = new wchar_t[200]; wchar_t* temp = new wchar_t[200]; BOOL KillTask(wchar_t* ExeFileName); PROCESSENTRY32 pe32; class UsingListboxDlg { public: UsingListboxDlg(); static BOOL CALLBACK DlgProc(HWND hWnd, UINT mes, WPARAM wp, LPARAM lp); static UsingListboxDlg* ptr; BOOL Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam); void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify); void Cls_OnClose(HWND hwnd); HWND hDialog, hEdit1, hEdit2, hEdit3, hList1, hButton0, hButton1, hButton2; LVCOLUMN lvc; LVITEM lv; }; int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpszCmdLine, int nCmdShow) { UsingListboxDlg dlg; return DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), NULL, UsingListboxDlg::DlgProc); } UsingListboxDlg* UsingListboxDlg::ptr; UsingListboxDlg::UsingListboxDlg() { ptr = this; } void UsingListboxDlg::Cls_OnClose(HWND hwnd) { EndDialog(hwnd, 0); } STARTUPINFO si; PROCESS_INFORMATION pi; BOOL UsingListboxDlg::Cls_OnInitDialog(HWND hwnd, HWND hwndFocus, LPARAM lParam) { ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); si.dwFlags = STARTF_USEPOSITION | STARTF_USESIZE | STARTF_USESHOWWINDOW; si.dwX = 10; si.dwY = 10; si.dwXSize = 500; si.dwYSize = 250; // si.dwXCountChars = 80; // si.dwYCountChars = 25; si.wShowWindow = SW_SHOW; // SW_MINIMIZE, SW_HIDE // получим дескрипторы элементов управления hButton0 = GetDlgItem(hwnd, IDC_BUTTON1); hButton1 = GetDlgItem(hwnd, IDC_BUTTON2); hButton2 = GetDlgItem(hwnd, IDC_BUTTON3); hEdit1 = GetDlgItem(hwnd, IDC_EDIT1); hEdit2 = GetDlgItem(hwnd, IDC_EDIT2); hEdit3 = GetDlgItem(hwnd, IDC_EDIT3); hList1 = CreateWindow(WC_LISTVIEW, NULL, WS_CHILD | WS_VISIBLE | LVS_REPORT, 10, 10, 600, 230, hwnd, (HMENU)500, GetModuleHandle(0), NULL); lvc.mask = LVCF_TEXT | LVCF_WIDTH | LVCF_FMT; lvc.fmt = LVCFMT_LEFT; ListView_SetExtendedListViewStyle(hList1, LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_HEADERDRAGDROP); // настройка шапки! lvc.iSubItem = 0; lvc.cx = 450; lvc.pszText = TEXT(«ID»); ListView_InsertColumn(hList1, 0, &lvc); // данные списка! HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; memset(&pe, 0, sizeof(pe)); pe.dwSize = sizeof(pe); if (Process32First(hSnapShot, &pe)) { int i = 0; while (Process32Next(hSnapShot, &pe)) { //_tprintf(_T(«ID: %4u Threads: %5u priority: %2u name: %sn»), pe.th32ProcessID, pe.cntThreads, pe.pcPriClassBase, pe.szExeFile); lv.iItem = i; ListView_InsertItem(hList1, &lv); wsprintf(str, L»%s», pe.szExeFile); ListView_SetItemText(hList1, i, 0, str); i++; } } return TRUE; } int items_count = 2; void UsingListboxDlg::Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) { switch (id) { case IDC_BUTTON3: TCHAR *path_to_exe; // путь к исполняемому файлу http://stackoverflow.com/questions/11339186/createprocess-fails-with-an-access-violation TCHAR *arguments; // строка с аргументами TCHAR *error_description; // строка с описанием ошибки path_to_exe = new TCHAR[256]; // The Unicode version of this function, CreateProcessW, can modify the contents of this string. Therefore, this parameter cannot be a pointer to read-only memory (such as a const variable or a literal string). If this parameter is a constant string, the function may cause an access violation. arguments = new TCHAR[256]; error_description = new TCHAR[256]; GetWindowText(hEdit1, temp, 200); wsprintf(str, L»C:\Windows\System32\%s.exe», temp); lstrcpy(path_to_exe, str); lstrcpy(arguments, L»some arguments for console command window»); if (!CreateProcess(path_to_exe, arguments, 0, 0, false, 0, 0, 0, &si, &pi)) { wsprintf(error_description, L»CreateProcess failed! :(nError number: %d (use error lookup)», GetLastError()); MessageBox(hwnd, error_description, L»Error!», MB_OK); } break; case IDC_BUTTON1: SendMessageA(hList1, WM_SETTEXT, WPARAM(0), LPARAM(«»)); HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe; memset(&pe, 0, sizeof(pe)); pe.dwSize = sizeof(pe); if (Process32First(hSnapShot, &pe)) { int i = 0; while (Process32Next(hSnapShot, &pe)) { //_tprintf(_T(«ID: %4u Threads: %5u priority: %2u name: %sn»), pe.th32ProcessID, pe.cntThreads, pe.pcPriClassBase, pe.szExeFile); lv.iItem = i; ListView_InsertItem(hList1, &lv); wsprintf(str, L»%s», pe.szExeFile); ListView_SetItemText(hList1, i, 0, str); i++; } } break; case IDC_BUTTON2: KillTask(L»calc.exe»); break; } } BOOL CALLBACK UsingListboxDlg::DlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { HANDLE_MSG(hwnd, WM_CLOSE, ptr->Cls_OnClose); HANDLE_MSG(hwnd, WM_INITDIALOG, ptr->Cls_OnInitDialog); HANDLE_MSG(hwnd, WM_COMMAND, ptr->Cls_OnCommand); } return FALSE; } BOOL KillTask(wchar_t* ExeFileName) { bool Co; HANDLE FS; HANDLE hProcess = NULL; DWORD dwError; int result; FS = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); pe32.dwSize = sizeof(pe32); Co = Process32First(FS, &pe32); while (Co) { if (lstrcmp(pe32.szExeFile, ExeFileName) == 0) { hProcess = OpenProcess(PROCESS_TERMINATE, false, pe32.th32ProcessID); if (hProcess == NULL) { if (GetLastError() != ERROR_ACCESS_DENIED) return FALSE; OSVERSIONINFO osvi; // определяем версию операционной системы osvi.dwOSVersionInfoSize = sizeof(osvi); GetVersionEx(&osvi); // мы больше ничего не можем сделать, если это не Windows NT if (osvi.dwPlatformId != VER_PLATFORM_WIN32_NT) return SetLastError(ERROR_ACCESS_DENIED), FALSE; // включим привилегию SE_DEBUG_NAME и попробуем еще раз TOKEN_PRIVILEGES Priv, PrivOld; DWORD cbPriv = sizeof(PrivOld); HANDLE hToken; // получаем токен текущего потока if (!OpenThreadToken(GetCurrentThread(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, FALSE, &hToken)) { if (GetLastError() != ERROR_NO_TOKEN) return FALSE; // используем токен процесса, если потоку не назначено // никакого токена if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES, &hToken)) return FALSE; } _ASSERTE(ANYSIZE_ARRAY > 0); Priv.PrivilegeCount = 1; Priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &Priv.Privileges[0].Luid); // попробуем включить привилегию if (!AdjustTokenPrivileges(hToken, FALSE, &Priv, sizeof(Priv), &PrivOld, &cbPriv)) { dwError = GetLastError(); CloseHandle(hToken); return SetLastError(dwError), FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { // привилегия SE_DEBUG_NAME отсутствует в токене // вызывающего CloseHandle(hToken); return SetLastError(ERROR_ACCESS_DENIED), FALSE; } // попробуем открыть описатель процесса еще раз hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe32.th32ProcessID); dwError = GetLastError(); // восстанавливаем исходное состояние привилегии AdjustTokenPrivileges(hToken, FALSE, &PrivOld, sizeof(PrivOld), NULL, NULL); CloseHandle(hToken); if (hProcess == NULL) return SetLastError(FALSE), NULL; } // пытаемся завершить процесс if (!TerminateProcess(hProcess, (UINT)-1)) { dwError = GetLastError(); CloseHandle(hProcess); return SetLastError(dwError), FALSE; } } Co = Process32Next(FS, &pe32); } CloseHandle(FS); CloseHandle(hProcess); return TRUE; }

Понравилась статья? Поделить с друзьями:
  • Как написать свой граббер
  • Как написать свой голосовой помощник
  • Как написать свой гимн
  • Как написать свой впн
  • Как написать свой возраст на английском