С Новым годом! Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/16: Рейтинг темы: голосов - 16, средняя оценка - 4.81
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Вычислить загрузку ЦП конкретного запущенного процесса на VB

20.03.2023, 13:48. Показов 3980. Ответов 63
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

В Интернете так и не нашёл кода для VB6, чтобы рассчитать загрузку ЦП конкретного запущенного процесса, как в диспетчере задач. Нашёл где-то скрипт VBS который можно переписать в VB6 конечно, но я не хочу использовать WMI. Лучше всего функции писать на чистом API. Правда в конференции VBStreets всё же есть код, но там используется библиотека DLL, а я хочу чтобы код был на чистом VB6. Плюс я ещё хочу чтобы значение в процентах получалось с десятыми и даже с сотыми одного процента. А там код возвращает только целые числа без дробей.

На этом форуме всё же затрагивалась такая тема, но лишь для получения загрузки ЦП всей системы сразу, всех запущенных процессов. А мне нужно для конкретного процесса по отдельности, так как это выполнено в любых диспетчерах задач. С чего же начать? Какую функцию для этого использовать? GetProcessTimes, скорее всего, но я ещё думаю и о других функциях.

Добавлено через 47 минут
Функция GetSystemTimes требует права доступа и для системных процессов она не покажет результатов. Тем более мне пришлось бы узнавать версию Windows для того чтобы определить PROCESS_QUERY_LIMITED_INFORMATION или PROCESS_QUERY_INFORMATION для XP. Поэтому я решил, что лучше всего использовать NtQuerySystemInformation, эта функция обходит ограничение прав доступа и показывает информацию даже для всех системных процессов.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.03.2023, 13:48
Ответы с готовыми решениями:

Как найти загрузку процессора для каждого запущенного процесса в процентах?
Подскажите, как найти загрузку процессора для каждого запущенного процесса в процентах на C# У меня получается как-то так: Вот...

Существует ли возможность вычислить md5 запущенного процесса?
Всем привет! Существует ли возможность вычислить md5 запущенного процесса? Я искал готовую функцию но к сожалению не смог найти...

Имя запущенного процесса
Здравствуйте. Хочу открыть файл. Делаю следующим образом: Process process = new Process(); process.StartInfo.FileName =...

63
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,531
Записей в блоге: 1
01.04.2023, 14:53
Студворк — интернет-сервис помощи студентам
Такой момент: в PE если есть табуляторы CPU Time, и Cycles, и в Cycles как раз-таки изменения происходят чаще даже при маленькой нагрузке. Но если отсортировать по "CPU Time" или по "Cycles" картина получается не одинаковая..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2023, 14:56  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
PE
что это такое вообще, ты думаешь все понимают эти две буквы что ли
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,531
Записей в блоге: 1
01.04.2023, 15:02
Цитата Сообщение от HackerVlad Посмотреть сообщение
Это будет тоже самое что и в коде Dragokas
ProcessUsagePercent = ProcessCycleDelta / CyclesDelta / SInfo.dwNumberOfProcessors / 10
По совету самого Dragokas-а кстати )
Цитата Сообщение от Dragokas Посмотреть сообщение
Если же результат записывается в переменную с плавающей запятой, то операция умножения будет быстрее операции деления:
Добавлено через 3 минуты
Цитата Сообщение от HackerVlad Посмотреть сообщение
что это такое вообще, ты думаешь все понимают эти две буквы что ли
Если зашли в эту тему, значит уже должны знать )) Не безызвестный Process Explorer
0
sleep
 Аватар для I can
4922 / 4567 / 840
Регистрация: 13.04.2015
Сообщений: 9,718
01.04.2023, 15:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ничего нажимать не надо там сразу для своего процесса показывает значения
Нет, не для этой программы, а допустим, для моей.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2023, 15:15  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Если же результат записывается в переменную с плавающей запятой, то операция умножения будет быстрее операции деления:
Я не знал, честно, но учитывая, что это операция только ОДНА то не думаю что мы заметим хоть какую-то крошечную разницу в скорости.

Добавлено через 2 минуты
Цитата Сообщение от testuser2 Посмотреть сообщение
в эту тему, значит уже должны знать )) Не безызвестный Process Explorer
В этой теме я говорил только про Process Hacker эта программа гораздо лучше чем твой
Цитата Сообщение от testuser2 Посмотреть сообщение
Не безызвестный Process Explorer
потому что она абсолютно бесплатная, с открытым исходным кодом.

Добавлено через 1 минуту
Цитата Сообщение от I can Посмотреть сообщение
Нет, не для этой программы, а допустим, для моей.
Ну так и впиши любой PID. Или прикрути сам список процессов со всеми PID'ами это уже думаю все умеют, это очень легко.
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,531
Записей в блоге: 1
01.04.2023, 15:21
Цитата Сообщение от testuser2 Посмотреть сообщение
а 10-кратную.
точнее не 10-кртную, 1000-кратную (учитывая преобразование в проценты), т.е. получается QueryProcessCycleTime возвращает время в секундах чтоль

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
В этой теме я говорил только про Process Hacker эта программа гораздо лучше чем твой
В отображении графиков точно не лучше.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2023, 15:21  [ТС]
а я люблю процесс хахер.
0
sleep
 Аватар для I can
4922 / 4567 / 840
Регистрация: 13.04.2015
Сообщений: 9,718
01.04.2023, 15:22
Цитата Сообщение от HackerVlad Посмотреть сообщение
Или прикрути сам список процессов со всеми PID'ами это уже думаю все умеют, это очень легко.
Я не умею. Как получить все PID-ы программы?

Добавлено через 7 секунд
Они же они меняются каждые несколько секунд...

Добавлено через 13 секунд
Хотя, хрен с ними, неинтересно
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2023, 15:23  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
Я не умею. Как получить все PID-ы программы?
Не говори глупости, на рейтинг свой посмотри, конечно ты всё умеешь. Первоапрельская шутка не зашла))))
1
sleep
 Аватар для I can
4922 / 4567 / 840
Регистрация: 13.04.2015
Сообщений: 9,718
01.04.2023, 15:24
Цитата Сообщение от HackerVlad Посмотреть сообщение
Первоапрельская шутка не зашла
Блин, я думал никто не поймёт.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
01.04.2023, 15:25  [ТС]
Цитата Сообщение от I can Посмотреть сообщение
все PID-ы программы
У одной программы только один ПИД))))))))))))))

Добавлено через 21 секунду
Цитата Сообщение от I can Посмотреть сообщение
Они же они меняются каждые несколько секунд...
ахаахахаах ну конечно
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 01:22  [ТС]
Только что случайно узнал одну вещь, если нагрузить ДВА и более процессора, то всё равно моя функция/программа покажет максимум процентов делёное на количество ядер. То есть если у меня 4 ядра, то показывает максимум 25 процентов, а это неправильно. Никто не указал мне на мою ошибку да и проверить я так просто этого не мог раньше случайно заметил.

Короче. Код работает неправильно!!!

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

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

Добавлено через 3 минуты
The trick, мне бы не помешала твоя помощь. Ты профессионал в многопоточности. Можешь ли скинуть самый простой код создания второго потока в котором просто засунуть бесконечный цикл Do Loop для нагрузки одного ядра на 100%
0
1384 / 839 / 91
Регистрация: 08.02.2017
Сообщений: 3,531
Записей в блоге: 1
07.04.2023, 02:34
Цитата Сообщение от HackerVlad Посмотреть сообщение
То есть если у меня 4 ядра, то показывает максимум 25 процентов, а это неправильно.
Вариант Драгокаса првильно работает, я браузером нагружал, там хоть до 150% можно грузануть )
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 08:10  [ТС]
Цитата Сообщение от testuser2 Посмотреть сообщение
Вариант Драгокаса првильно работает
Да, я неправильно формулу переписал. Нужно поменять порядок деления на количество ядер. Неправильно поочерёдность идёт скорее всего.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 19:38  [ТС]
У Драгокаса функция правильно была написана, а я сам просто ошибся и переписал его код неправильно у себя.
Ошибки я исправил.

Visual Basic
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
' Вычислить загрузку ЦП конкретного запущенного процесса
Public Function GetProcessUsage(Optional pid As Long) As Single
    Dim buf() As Byte
    Dim ret As Long
    Dim getpid As Long
    Dim Offset As Long
    Dim deltaOffset As Long
    Dim UserTime As Currency
    Dim KernelTime As Currency
    Dim UserTimeRet As Currency
    Dim KernelTimeRet As Currency
    Dim GetProcessUsageRet As Currency
    Static OldUserTime As Currency
    Static OldKernelTime As Currency
    Static FirstRun As Boolean
    Dim SInfo As SYSTEM_INFO
    
    If pid = 0 Then pid = GetCurrentProcessId
    
    If NtQuerySystemInformation(SystemProcessInformation, ByVal 0&, 0&, ret) = STATUS_INFO_LENGTH_MISMATCH Then
        ReDim buf(ret - 1)
        
        If NtQuerySystemInformation(SystemProcessInformation, buf(0), ret, ret) = STATUS_SUCCESS Then
            Do
                GetMem4 buf(Offset + &H44), getpid
                If getpid = pid Then ' Эти значения ни чем не отличаются от полученных с помощью GetProcessTimes
                    GetMem8 buf(Offset + &H28), UserTime
                    GetMem8 buf(Offset + &H30), KernelTime
                    Exit Do
                End If
                
                GetMem4 buf(Offset), deltaOffset
                Offset = Offset + deltaOffset
            Loop While deltaOffset
        End If
    End If
    
    If UserTime > 0 And KernelTime > 0 Then
        If FirstRun = False Then
            FirstRun = True
            
            OldUserTime = UserTime
            OldKernelTime = KernelTime
            GetProcessUsage = "0"
            Exit Function
        Else
            GetSystemInfo SInfo
            
            UserTimeRet = (UserTime - OldUserTime)
            KernelTimeRet = (KernelTime - OldKernelTime)
            
            GetProcessUsageRet = (UserTimeRet + KernelTimeRet) / 10 / SInfo.dwNumberOfProcessors
            If GetProcessUsageRet > 100 Then GetProcessUsageRet = 100
            
            GetProcessUsage = Round(GetProcessUsageRet, 2)
            
            OldUserTime = UserTime
            OldKernelTime = KernelTime
        End If
    Else
        GetProcessUsage = "0" ' Иногда UserTime или KernelTime почему-то может быть сразу нулём
    End If
End Function
 
' Вычислить загрузку ЦП конкретного запущенного процесса для Windows Vista и выше
Public Function GetProcessUsageByCycleTime(Optional pid As Long) As Single
    Dim hProc As Long
    Dim CycleTime As Currency
    Dim CyclesDelta As Currency
    Dim ProcessCycles As Currency
    Dim ProcessCycleDelta As Currency
    Dim SInfo As SYSTEM_INFO
    Dim ProcessUsagePercent As Single
    Static OldProcessCycles As Currency
    Static OldCycleTime As Currency
    Static FirstRun As Boolean
    
    If pid = 0 Then
        hProc = GetCurrentProcess()
    Else
        hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid)
    End If
    
    If hProc <> 0 Then
        QueryProcessCycleTime hProc, ProcessCycles
        
        If ProcessCycles > 0 Then
            GetSystemInfo SInfo
            
            If FirstRun = False Then
                FirstRun = True
                
                OldProcessCycles = ProcessCycles
                QueryPerformanceCounter OldCycleTime ' Здесь оказывается важно ещё запоминать QueryPerformanceCounter
                
                GetProcessUsageByCycleTime = 0
                Exit Function
            Else
                QueryPerformanceCounter CycleTime
                CyclesDelta = CycleTime - OldCycleTime
                
                ProcessCycleDelta = ProcessCycles - OldProcessCycles
                ProcessUsagePercent = ProcessCycleDelta / CyclesDelta / SInfo.dwNumberOfProcessors / 10
                GetProcessUsageByCycleTime = Round(ProcessUsagePercent, 2)
                
                OldProcessCycles = ProcessCycles
                OldCycleTime = CycleTime
            End If
        End If
        
        If pid <> 0 Then CloseHandle hProc
    End If
End Function
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 19:52  [ТС]
The trick, поменяй пожалуйста в готовых решениях эту зипку.
Размещаю готовый вариант с исправленными ошибками. Теперь показывает правильно, если загружать два и более ядра.
Вложения
Тип файла: zip GetProcessUsage.zip (11.4 Кб, 7 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 19:56  [ТС]
Извините, опять косяк был, уже последний думаю. Больше чем за 100% зашкаливало. Теперь исправил. Вот теперь уже окончательный готовый вариант.
Вложения
Тип файла: zip GetProcessUsage.zip (11.4 Кб, 9 просмотров)
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 19:58  [ТС]
Код наверное надо ещё тут исправить как-то? Или снова постить...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
07.04.2023, 20:00
HackerVlad, в тему тестирование полезных кодов, прикрепи пост целиком - я обновлю вместе с архивом.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
07.04.2023, 21:01  [ТС]
ну архив ты обновил правильно а вот код там надо бы тоже подправить конечно формы и модуля

Добавлено через 7 минут
Цитата Сообщение от The trick Посмотреть сообщение
в тему тестирование полезных кодов, прикрепи пост целиком
Тестирование полезных кодов и примеров

Добавлено через 1 минуту
И вот окончательный вариант функции, хотелось бы поменять это в сообщении тут сверху Вычислить загрузку ЦП конкретного запущенного процесса на VB но у меня нету кнопки редактирования.

Visual Basic
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
' Вычислить загрузку ЦП конкретного запущенного процесса для Windows Vista и выше
Public Function GetProcessUsageByCycleTime(Optional pid As Long) As Single
    Dim hProc As Long
    Dim CycleTime As Currency
    Dim CyclesDelta As Currency
    Dim ProcessCycles As Currency
    Dim ProcessCycleDelta As Currency
    Dim SInfo As SYSTEM_INFO
    Dim ProcessUsagePercent As Single
    Static OldProcessCycles As Currency
    Static OldCycleTime As Currency
    Static FirstRun As Boolean
    
    If pid = 0 Then
        hProc = GetCurrentProcess()
    Else
        hProc = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, 0, pid)
    End If
    
    If hProc <> 0 Then
        QueryProcessCycleTime hProc, ProcessCycles
        
        If ProcessCycles > 0 Then
            GetSystemInfo SInfo
            
            If FirstRun = False Then
                FirstRun = True
                
                OldProcessCycles = ProcessCycles
                QueryPerformanceCounter OldCycleTime ' Здесь оказывается важно ещё запоминать QueryPerformanceCounter
                
                GetProcessUsageByCycleTime = 0
                Exit Function
            Else
                QueryPerformanceCounter CycleTime
                CyclesDelta = CycleTime - OldCycleTime
                
                ProcessCycleDelta = ProcessCycles - OldProcessCycles
                ProcessUsagePercent = ProcessCycleDelta / CyclesDelta / SInfo.dwNumberOfProcessors / 10
                
                If ProcessUsagePercent > 100 Then ProcessUsagePercent = 100
                
                GetProcessUsageByCycleTime = Round(ProcessUsagePercent, 2)
                
                OldProcessCycles = ProcessCycles
                OldCycleTime = CycleTime
            End If
        End If
        
        If pid <> 0 Then CloseHandle hProc
    End If
End Function
Добавлено через 38 минут
Единственный минус этих функций, что при загрузке одного ядра (из моих четырёх) на 100% у меня программа выдаёт 25% с хвостиком. При загрузке двух ядер 50 процентов с хвостиком. Я не знаю, может это и не баг. Может этот хвостик и нужен. Фиг его знает.

Добавлено через 1 минуту
Но больше 100% никогда не поднимется это точно я искусственно ограничил. Чтобы не было 102% или 103%...

Добавлено через 2 минуты
Ну и плюс ко всему прочему, вы понимаете, что это пример лишь для слежения за ОДНИМ только процессом. Пакетная обработка по 10 процессов выглядела бы несколько иначе конечно.

Плюс здесь будет иметься мелкий баг при переключении слежения на другой процесс первое значение будет неправильным, но зато всегда со второго раза всегда правильное значение показывает. Поэтому лучше всего первый замер делать именно во время загрузки формы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.04.2023, 21:01
Помогаю со студенческими работами здесь

Отображение запущенного процесса.
Я пишу программу, и у меня такая штука типо друзей. Разъясню кратко! Есть сайт на нем юзеры (взять тот же форум IPB) - там есть...

Поиск запущенного процесса
import pysftp as SFTP Запуская pysftp, к примеру заливает файл на другой сервер. Затем смотрю запущенные процессы import...

Контроль запущенного процесса
С помощью QProcess я запускаю программу. Вот как я связал процесс с окном QObject::connect(ExeProc, SIGNAL(started()), this,...

MD5 запущенного процесса
Необходимо вычислить мд5 хеш файла. Использую функцию, которая открывает файл для чтения и вычисляет мд5, но проблема в том, что таким...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru