Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/40: Рейтинг темы: голосов - 40, средняя оценка - 4.80
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443

Загруженность процессора?

02.04.2020, 16:05. Показов 9163. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уже нашёл ответ на Си. Помогите, пожалуйста, с "переводом" на Visual Basic.

Ну а в идеале можно и сразу на PowerBasic

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include "TCHAR.h"
#include "pdh.h"
 
static PDH_HQUERY cpuQuery;
static PDH_HCOUNTER cpuTotal;
 
void init(){
    PdhOpenQuery(NULL, NULL, &cpuQuery);
    // You can also use L"\\Processor(*)\\% Processor Time" and get individual CPU values with PdhGetFormattedCounterArray()
    PdhAddEnglishCounter(cpuQuery, L"\\Processor(_Total)\\% Processor Time", NULL, &cpuTotal);
    PdhCollectQueryData(cpuQuery);
}
 
double getCurrentValue(){
    PDH_FMT_COUNTERVALUE counterVal;
 
    PdhCollectQueryData(cpuQuery);
    PdhGetFormattedCounterValue(cpuTotal, PDH_FMT_DOUBLE, NULL, &counterVal);
    return counterVal.doubleValue;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.04.2020, 16:05
Ответы с готовыми решениями:

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

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

Загруженность процессора
Доброго вечера всем! Есть ли в php что нибудь для определения текущей загрузки процессора процессами (операционка Linux 2.6)?

47
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
02.04.2020, 17:20
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

C переводом не помогу. Но есть проект на VB6
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
Private Type FILETIME
    dwLowDateTime As Currency
    dwHighDateTime As Currency
End Type
Private Declare Function GetSystemTimes Lib "kernel32.dll" (ByRef idleTime As _
    FILETIME, ByRef kernelTime As FILETIME, ByRef userTime As FILETIME) As Boolean
Dim StartTimes(1) As Currency
Dim EndTimes(1) As Currency
Dim FirstRun As Boolean
Private Function CPU() As String
'On Error Resume Next
   Static CPU_Kernel As FILETIME
   Static CPU_User As FILETIME
   Static CPU_Idle As FILETIME
   Dim Idle_Time As Long
   Dim Total_Time As Long
   Dim CPU_Percent As Single
   Dim Text As String
   ret = GetSystemTimes(CPU_Idle, CPU_Kernel, CPU_User)
   
   EndTimes(0) = CPU_Kernel.dwLowDateTime + CPU_User.dwLowDateTime
   EndTimes(1) = CPU_Idle.dwLowDateTime
  
   If FirstRun = True Then
       StartTimes(1) = EndTimes(1)
      StartTimes(0) = EndTimes(0)
      FirstRun = False
      CPU = "0,0"
    End If
      
   Idle_Time = EndTimes(1) - StartTimes(1)
   
   If Idle_Time > 0 Then
      Total_Time = EndTimes(0) - StartTimes(0)
      CPU_Percent = ((Total_Time - Idle_Time) / Total_Time) * 100
      Text = Round(CPU_Percent, 2) & " %"
   End If
   StartTimes(1) = EndTimes(1)
   StartTimes(0) = EndTimes(0)
   CPU = Text
 End Function
 
Private Sub Form_Load()
FirstRun = True
End Sub
 
Private Sub Timer1_Timer()
Label1.Caption = CPU
 
End Sub
2
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
02.04.2020, 18:05  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
C переводом не помогу. Но есть проект на VB6
Спасибо, но всё-таки сишный пример с PdhOpenQuery выглядит как-то более компактно
Если так и не сумею сделать "перевод", возьму ваш вариант за основу.
0
Эксперт по электронике
6562 / 3189 / 335
Регистрация: 28.10.2011
Сообщений: 12,474
Записей в блоге: 7
02.04.2020, 18:27
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

Цитата Сообщение от Power_Basic Посмотреть сообщение
но всё-таки сишный пример с PdhOpenQuery выглядит как-то более компактно
На PowerBasic код будет почти такой же. Те же функции и структуры, но синтаксис немного другой.

Delete
 Комментарий модератора 
п.5.8 Запрещено публиковать ссылки на другие форумы
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
02.04.2020, 19:25  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
На PowerBasic код будет почти такой же. Те же функции и структуры, но синтаксис немного другой.
Спасибо, буду разбираться. Там код для четвёртой версии. У меня десятая. Они не во всём совместимы. Так вот сразу "с листа" компилятор выдаёт ошибки. Но в целом, направление мне уже понятно.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
02.04.2020, 20:33
Цитата Сообщение от Power_Basic Посмотреть сообщение
но всё-таки сишный пример с PdhOpenQuery выглядит как-то более компактно
Ну так там все объявления в файле pdh.h
А как на PB перевести, так размер вырастет!
0
02.04.2020, 20:46

Не по теме:

Цитата Сообщение от locm Посмотреть сообщение
п.5.8 Запрещено публиковать ссылки на другие форумы
Вот и помогай после этого...

0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
02.04.2020, 21:40
Цитата Сообщение от locm Посмотреть сообщение
Вот и помогай после этого...
Помогайте правильно, нашли код так скопируйте его сюда, во первых, он тут не потеряется в случае если чужой форум закроется, ну и правила не придется нарушать.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
02.04.2020, 22:47  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Ну так там все объявления в файле pdh.h
А как на PB перевести, так размер вырастет!
На самом деле, под словом "компактно" я подразумевал вовсе не размеры самого кода, а характер работы, которую этот код выполняет. Мне пока ещё трудно судить, материал не простой, я сейчас всё ещё пытаюсь разобраться, но выглядит так, что в коде на VB мы получаем результат с помощью вычисления соотношения таймингов, то есть как бы "окольными путями", а функции семейства Pdh... дают нам результат как бы сразу "в лоб"

Да там вообще огромные возможности у этой библиотеки. как я понял. Можно же не только информацию по процессору получить, но и вообще почти по любому аспекту системы. Это как бы открывает огромный "мир возможностей", надо только разобраться во всём, что я сейчас и пытаюсь сделать.
А теперь, когда обнаружился код на моём родном языке, всё выглядит уже гораздо проще и перспективнее.
Миниатюры
Загруженность процессора?  
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
03.04.2020, 06:52
Цитата Сообщение от Power_Basic Посмотреть сообщение
результат с помощью вычисления соотношения таймингов, то есть как бы "окольными путями", а функции семейства Pdh... дают нам результат как бы сразу "в лоб"
Спора нет, специальный интерфейс для получения разнообразной информации о системе в виде счетчиков производительности для того и существует.
На PureBasic использую оба способа. Performance Data Helper нравится, что помимо общей загрузки проца можно выделить отдельно загрузку по каждому ядру.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
05.04.2020, 16:03  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Performance Data Helper нравится, что помимо общей загрузки проца можно выделить отдельно загрузку по каждому ядру.
После долгих изысканий выяснил следующее.
Этот Performance Data Helper какой-то вымерший мамонт, честное слово
Ну так мало информации о нём за последние 20 лет в наших бейсиковских интернет-сообществах, что просто диву даюсь. И это даже при том, что Майкрософт до сих пор поддерживает документацию по семейству функций в этой библиотеке, специально предназначенных для VB:
https://docs.microsoft.com/ru-... sual-basic

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

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
' Visual Basic 4.0 definitions file for use with
' PDH.DLL the Peformance Data Helper DLL
'
' Copyright (c) 1996 by Microsoft Corporation
'
' 19-Apr-1996 Bob Watson
'
' = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
'
' Pdh Error status return values
'
Private Const ERROR_SUCCESS = 0
Private Const PDH_CSTATUS_VALID_DATA = &H20000000
Private Const PDH_CSTATUS_NEW_DATA = &H20000001
Private Const PDH_CSTATUS_NO_MACHINE = &HA00007D0
Private Const PDH_CSTATUS_NO_INSTANCE = &HA00007D1
Private Const PDH_MORE_DATA = &HA00007D2
Private Const PDH_CSTATUS_ITEM_NOT_VALIDATED = &HA00007D3
Private Const PDH_RETRY = &HA00007D4
Private Const PDH_NO_DATA = &HA00007D5
Private Const PDH_CALC_NEGATIVE_DENOMINATOR = &HA00007D6
Private Const PDH_CALC_NEGATIVE_TIMEBASE = &HA00007D7
Private Const PDH_CALC_NEGATIVE_VALUE = &HA00007D8
Private Const PDH_DIALOG_CANCELLED = &HA00007D9
Private Const PDH_CSTATUS_NO_OBJECT = &HE0000BB8
Private Const PDH_CSTATUS_NO_COUNTER = &HE0000BB9
Private Const PDH_CSTATUS_INVALID_DATA = &HE0000BBA
Private Const PDH_MEMORY_ALLOCATION_FAILURE = &HE0000BBB
Private Const PDH_INVALID_HANDLE = &HE0000BBC
Private Const PDH_INVALID_ARGUMENT = &HE0000BBD
Private Const PDH_FUNCTION_NOT_FOUND = &HE0000BBE
Private Const PDH_CSTATUS_NO_COUNTERNAME = &HE0000BBF
Private Const PDH_CSTATUS_BAD_COUNTERNAME = &HE0000BC0
Private Const PDH_INVALID_BUFFER = &HE0000BC1
Private Const PDH_INSUFFICIENT_BUFFER = &HE0000BC2
Private Const PDH_CANNOT_CONNECT_MACHINE = &HE0000BC3
Private Const PDH_INVALID_PATH = &HE0000BC4
Private Const PDH_INVALID_INSTANCE = &HE0000BC5
Private Const PDH_INVALID_DATA = &HE0000BC6
Private Const PDH_NO_DIALOG_DATA = &HE0000BC7
Private Const PDH_CANNOT_READ_NAME_STRINGS = &HE0000BC8
'
' Counter Browser Detail Level Definitions
'
Private Const PERF_DETAIL_NOVICE = 100
Private Const PERF_DETAIL_ADVANCED = 200
Private Const PERF_DETAIL_EXPERT = 300
Private Const PERF_DETAIL_WIZARD = 400
'
' Standard PDH Function prototypes
'
Private Declare Function PdhOpenQuery Lib "Pdh.Dll" Alias "PdhVbOpenQuery" (ByRef QueryHandle As Long) As Long
' PdhOpenQuery Creates an empty performance data query structure
' QueryHandle The Id of the query created is returned in this buffer
' Return Value an error code from the list above. ERROR_SUCCESS indicates a valid query was created and the value returned in QueryHandle is valid
Private Declare Function PdhAddCounter Lib "Pdh.Dll" Alias "PdhVbAddCounter" (ByVal QueryHandle As Long, ByVal CounterPath As String, ByRef CounterHandle As Long) As Long
' PdhAddCounter Adds a counter to the specified query
' QueryHandle the QueryHandle of the query to add the counter to. This is the value initialized by the PdhOpenQuery function
' CounterPath the counter path string of the counter to add. This value can be obtained by either the PdhGetOneCounterPath or the PdhCreateCounterPathList functions
' CounterHandle The handle to the counter that is added to the query
' Return Value an error code from the list above. ERROR_SUCCESS indicates a valid counter was created
Private Declare Function PdhRemoveCounter Lib "Pdh.Dll" (ByVal CounterHandle As Long) As Long
' PdhRemoveCounter Removes the specified counter from the query to which it belongs
' CounterHandle Handle of the counter to remove
' Return Value an error code from the list above. ERROR_SUCCESS indicates the counter was removed
Private Declare Function PdhCollectQueryData Lib "Pdh.Dll" (ByVal QueryHandle As Long) As Long
' PdhCollectQueryData Obtains the current values of each counter in the query (the value of each counter must be retrieved individually using the PdhGetDoubleCounterValue, after the data has been updated)
' QueryHandle Handle of the query to refresh
' Return Value an error code from the list above. ERROR_SUCCESS indicates the function completed successfully
Private Declare Function PdhCloseQuery Lib "Pdh.Dll" (ByVal QueryHandle As Long) As Long
' PdhCloseQuery Terminates data collection and frees the resources associated with the query
' QueryHandle Handle of query to close and free
' Return Value an error code from the list above. ERROR_SUCCESS indicates the query was freed
'
' DPH VB Helper Functions
'
Private Declare Function PdhGetDoubleCounterValue Lib "Pdh.Dll" Alias "PdhVbGetDoubleCounterValue" (ByVal CounterHandle As Long, ByRef CounterStatus As Long) As Double
' PdhGetDoubleCounterValue retrieves the value of the specified counter as a double precision real number
' CounterHandle The handle of the counter to retrive
' CounterStatus returns the current status of the counter as a PDH_ status value defined above
' Return Value The double precision real value of the counter
Private Declare Function PdhGetOneCounterPath Lib "Pdh.Dll" Alias "PdhVbGetOneCounterPath" (ByVal PathString As String, ByVal PathLength As Long, ByVal DetailLevel As Long, ByVal CaptionString As String) As Long
' PdhGetOneCounterPath Displays a dialog box prompting the user to select one counter path
' PathString Preinitialized buffer to retrieve the path string
' PathLength Size of initialized buffer
' DetailLevel Level of detail to filter counter display. 0 shows all counters and hides detail combo box.
' CaptionString String to display in caption bar of browser
' Return Value returns the number of characters written to the PathString buffer.
Private Declare Function PdhCreateCounterPathList Lib "Pdh.Dll" Alias "PdhVbCreateCounterPathList" (ByVal DetailLevel As Long, ByVal CaptionString As String) As Long
' PdhCreateCounterPathList Displays a dialog box prompting the user to select multiple counters Use the next function to read the selected path strings
' DetailLevel Level of detail to filter counter display. 0 shows all counters and hides detail combo box.
' CaptionString String to display in caption bar of browser dialog box
' Return Value returns the number of path strings selected
Private Declare Function PdhGetCounterPathFromList Lib "Pdh.Dll" Alias "PdhVbGetCounterPathFromList" (ByVal Index As Long, ByVal Buffer As String, ByVal BufferLength As Long) As Long
' PdhGetCounterPathFromList Retrieves an individual path string from the list created by the PdhCreateCounterPathList function call
' Index Index of the path string to retrieve starting at 1 and going to the value returned by the previous call to PdhCreateCounterPathList
' Buffer An initialized string buffer to retrieve the selected string
' BufferLength The maximum size of the buffer
' Return Value The number of characters copied to Buffer
Private Declare Function PdhGetCounterPathElements Lib "Pdh.Dll" Alias "PdhVbGetCounterPathElements" (ByVal PathString As String, ByVal MachineName As String, ByVal ObjectName As String, ByVal InstanceName As String, ByVal ParentInstance As String, ByVal CounterName As String, ByVal BufferSize As Long) As Long
' PdhGetCounterPathElements Reads a performance counter path string and returns the components as individual strings
' PathString The full path string to read
' MachineName The buffer to receive the machine name
' ObjectName The buffer to receive the object name
' InstanceName The buffer to receive the instance name
' ParentInstance The buffer to receive the parent instance
' CounterName The buffer to receive the counter name
' BufferSize The size of the string buffers
' ReturnValue DPH status code. 0 means the function succeeded.
Private Declare Function PdhIsGoodStatus Lib "Pdh.Dll" Alias "PdhVbIsGoodStatus" (ByVal StatusValue As Long) As Long
' PdhIsGoodStatus tests the status value returned by a PDH function to determine if the function or value returned is good/success (nozero) or bad/error (zero)
' StatusValue the value returned by a call to a PDH function
' Return Value 0 if the status is not good non-zero if the status is good
 
 
Public Function PerfData(ByVal MachName As String, ByVal Object As String, ByVal Instance As String, ByVal Counter As String, ByRef QHndl As Long, ByRef CHndl As Long) As Long
    Static lbBeenHere As Boolean
    Dim llReturn As Long
    Dim ldReturn As Double
    Dim lsPath As String
    'Dim qHndl As Long
    'Dim cHndl As Long
    Dim cStat As Long
    
    On Error GoTo ProcError
    
    If QHndl > 0 Then
    llReturn = PdhCollectQueryData(QHndl)
    ldReturn = PdhGetDoubleCounterValue(CHndl, cStat)
    PerfData = CLng(ldReturn)
    Else
    llReturn = PdhConnectMachine(MachName)
    llReturn = PdhOpenQuery(QHndl)
    llReturn = PdhAddCounter(QHndl, "\\" & MachName & "\" & Object & "(" & Instance & ")\" & Counter, CHndl)
    llReturn = PdhCollectQueryData(QHndl)
    ldReturn = PdhGetDoubleCounterValue(CHndl, cStat)
    PerfData = CLng(ldReturn)
    lbBeenHere = True
    End If
    
    Exit Function
ProcError:
    MsgBox "PerfData Error " & Err.Description
End Function
Цитата Сообщение от Power_Basic Посмотреть сообщение
Уже нашёл ответ на Си. Помогите, пожалуйста, с "переводом" на Visual Basic.
На самом деле, размести этот дядька (Bob Watson) свой код в этой ветке, это реально можно было бы считать лучшим ответом
Требовалось перевести с Си на VB, ну вот, типо, и перевёл как сумел
Автор топика в восторге!

На самом деле, такую "прелесть" на современном компьютере даже и запускать страшно. Ну по крайней мере, лично я не решился
Если найдутся смельчаки, отпишитесь, плиз, о результатах этого рискованного эксперимента

Теперь о причинах "забвения" этой библиотеки. Ну по крайней мере, как это видится с моей стороны:
1. Серьёзные проблемы совместимости с 64-разрядной архитектурой:
https://docs.microsoft.com/ru-... it-support
Как я понял для таких систем (а сейчас их уже почти 100%) всё равно отсылают к "Windows Management Instrumentation"
https://docs.microsoft.com/ru-... start-page

2. Проблемы использования на локализованных компьютерах.
Проблема в том, что счётчики обзываются (и изменить это никак нельзя!) локализованными именами, ну то есть так вот прямо по-нашему, по-русски
А чтобы получить значение счётчика, его имя (в документации это называется "путь к счётчику") нужно указывать именно по-русски. А где узнать, как получить?
Для этого майкрософтовцы предлагают аж 5 способов
Но все они такие извилистые, что заблудиться раз плюнуть
Ковырял-ковырял, наковырял, что для производительности процессора путь к счётчику следует называть вот так:
"\Процессор(_Total)\% загруженности процессора". Но и то до конца не уверен, что это правильно.
А самое печальное состоит в том, что даже если программист передаст функции PdhAddCounter неправильное имя, эта функция всё равно вернёт ему значение ERROR_SUCCESS по той причине, что функция предполагает, что если введено незнакомое имя, то значит программист собирается создать новый счётчик

3. Ну и наконец самое главное! Вот что там написано конкретно о счётчике производительности процессора:
% загруженности процессора - это доля времени, которую процессор тратит на обработку всех потоков команд, кроме простаивающего. Это значение равно разнице между 100 % и процентом времени, которое процессор затрачивает на выполнение простаивающего потока. (Простаивающий поток команд занимает рабочее время процессора в отсутствие других потоков команд.) Этот счетчик является основным показателем загруженности процессора. Он показывает среднее значение занятости процессора в течение интервала измерения. Определение того, простаивает ли процессор, выполняется за внутренний интервал опроса по системным часам (10 мсек). Поэтому для современных быстрых процессоров этот счетчик может занижать использование процессора, так как процессор может затрачивать много времени на обслуживание потоков между опросами по системным часам. Примеры приложений, для которых более вероятно неточное измерение, - таймерные приложения, основанные на загрузке, так как таймеры получают сигнал сразу же после измерения.
Ну а поскольку эта штука сама по себе древняя-предревняя, то под "современными быстрыми процессорами" наверняка подразумевается Пентиум-4
Да и потом, что такое "таймерные приложения"? Это когда через определённые интервалы времени (ну то есть имено по таймеру!) программист обращается к значению этого счётчика. Ну а без таймера-то какой вообще смысл во всём этом "мероприятии"?!

Вывод
Короче говоря, ставлю на этой хрени (PDH) большой жирный красный крест и теперь буду пытаться копать в сторону WMI (Windows Management Instrumentation).
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
05.04.2020, 16:58
Цитата Сообщение от Power_Basic Посмотреть сообщение
копать в сторону WMI
Не была бы эта штука такой тормознутой! После каждого запроса надо ждать по пол минуты
Это не считая того, что может быть и вовсе отключено по каким либо причинам - net stop Winmgmt и усё!
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
05.04.2020, 17:12  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Не была бы эта штука такой тормознутой! После каждого запроса надо ждать по пол минуты
Это не считая того, что может быть и вовсе отключено по каким либо причинам - net stop Winmgmt и усё!
Ну тогда ваш метод реально рулит!
Сейчас отмотал обратно и отметил его как лучший ответ. Воистину, большое видится на расстояньи.
0
Эксперт по электронике
6562 / 3189 / 335
Регистрация: 28.10.2011
Сообщений: 12,474
Записей в блоге: 7
05.04.2020, 17:41
Цитата Сообщение от Power_Basic Посмотреть сообщение
А чтобы получить значение счётчика, его имя (в документации это называется "путь к счётчику") нужно указывать именно по-русски. А где узнать, как получить?
Не на VB, но код рабочий (x86, x64).
Код позволяет получить общую загрузку процессора и его ядер в отдельности.
Кликните здесь для просмотра всего текста
PureBasic
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
EnableExplicit
 
#COUNTERPERF_PROCESSOR = 238
#COUNTERPERF_PERCENTPROCESSORTIME = 6
#PDH_CSTATUS_VALID_DATA = 0
 
Structure PDH_FMT_COUNTERVALUE
    CStatus.l
    padding.l
    ulValueLow.l
    ulValueHigh.l
EndStructure
 
Global hQuery, NumCores
Global Dim cpuCounters(0)
 
Procedure.s GetCPUCounter(strInstance.s)
  Protected LibID, *F, NameLen, i, Res.s
  Protected ObjectName.s, CounterName.s
  
  LibID = OpenLibrary(#PB_Any, "pdh.dll")
  If LibID
    *F = GetFunction(LibID, "PdhLookupPerfNameByIndexW")
    If *F
      
      NameLen = #MAX_PATH
      ObjectName = Space(NameLen)
      i = CallFunctionFast(*F,#Null, #COUNTERPERF_PROCESSOR, @ObjectName, @NameLen)
      
      NameLen = #MAX_PATH
      CounterName = Space(NameLen)
      
      i = CallFunctionFast(*F,#Null, #COUNTERPERF_PERCENTPROCESSORTIME, @CounterName, @NameLen)
      Res = "\" + ObjectName + "(" + strInstance + ")\" + CounterName
    EndIf
    CloseLibrary(LibID)
  EndIf
  
  ProcedureReturn Res
EndProcedure
 
 
Procedure InitializeCPU()
  Protected pdhStatus, SysInfo.SYSTEM_INFO, CPU_Obj.s
  Protected hCounter, i
  
  GetSystemInfo_(@SysInfo)
  NumCores = SysInfo\dwNumberOfProcessors - 1
  ReDim cpuCounters(NumCores)
  
  pdhStatus = PdhOpenQuery_(0, 1, @hQuery)
  If pdhStatus = 0
    For i = 0 To NumCores
      CPU_Obj = GetCPUCounter(Trim(Str(i)))
      If PdhValidatePath_(CPU_Obj) <> #ERROR_SUCCESS
        MessageRequester("Error","Unable To initialize CPU usage.")
      EndIf
      pdhStatus = PdhAddCounter_(hQuery, CPU_Obj, 0, @hCounter)
      If pdhStatus = #PDH_CSTATUS_VALID_DATA: cpuCounters(i) = hCounter: EndIf
    Next i
    
    If hCounter <> 0 
      ProcedureReturn 1
    EndIf
  EndIf
  
  MessageRequester("Error","Unable To initialize CPU usage.")
  
EndProcedure
 
Procedure Close_CPU_Usage()
    PdhCloseQuery_(hQuery) ;' close cpu usage
EndProcedure
 
Procedure Update_Cpu_Usage(Array dCPU.d(1))
  Protected lpValue.PDH_FMT_COUNTERVALUE
  Protected i, dwType
  
  PdhCollectQueryData_(hQuery)
  For i = 0 To NumCores
    PdhGetFormattedCounterValue_(cpuCounters(i), $200, @dwType, @lpValue)
    dCPU(i) = PeekD(@lpValue\ulValueLow)
  Next
  
EndProcedure
 
 
InitializeCPU()
 
Define x=0, cpu.d, i
Dim dCPU.d(NumCores)
 
Repeat
  Update_Cpu_Usage(dCPU())
  cpu=0
  For i=0 To NumCores
    cpu + dCPU(i)
  Next
  Debug cpu/(NumCores+1)
  x+1
  Delay(1000)
Until x>20
 
Close_CPU_Usage()
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
05.04.2020, 18:38
Лучший ответ Сообщение было отмечено Power_Basic как решение

Решение

Цитата Сообщение от Power_Basic Посмотреть сообщение
WMI (Windows Management Instrumentation).
Есть простой код загрузки CPU. Правда, показания расходятся чуток, но зато очень простой в реализации, для домашнего пользования пойдет:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Private wmi As Object
 
Private Sub Form_Load()
    Me.Show
    Set wmi = GetObject("winmgmts:\\.\root\CIMV2")
    Timer1.Interval = 200
    Timer1_Timer
End Sub
 
 
Private Sub Timer1_Timer()
    Dim query As Object, counter As Object
    Dim percent As Double
    Set query = wmi.ExecQuery("SELECT * FROM Win32_PerfFormattedData_Counters_ProcessorInformation")
    For Each counter In query
        percent = percent + counter.PercentProcessorTime
    Next
    Text1.Text = Format(percent / query.Count, "0.00") & "%"
End Sub
1
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
05.04.2020, 19:14  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Не на VB, но код рабочий (x86, x64).
Код позволяет получить общую загрузку процессора и его ядер в отдельности.
Код посмотрел.
Честно сказать, для меня всё-таки сложновато воспринимать незнакомый язык.
Но судя по используемым WIN_API функциям, мы сначала получаем путь к интересующему нас счётчику, комбинируя:

Visual Basic
1
2
3
GetSystemInfo
PdhLookupPerfNameByIndexW
PdhValidatePath
ну а потом действуем вот так:

Visual Basic
1
2
3
4
5
PdhOpenQuery
  PdhAddCounter
  PdhCollectQueryData
  PdhGetFormattedCounterValue
PdhCloseQuery
Спасибо, попробую покопать в этом направлении. О результатах потом отпишусь.
Очень обнадёживает то, что, как вы говорите, всё-таки есть возможность использовать пакет этих функций для 64-разрядной архитектуры. Это очень хорошо, а то они меня реально отпугнули своими мутными разъяснениями:
https://docs.microsoft.com/ru-... it-support
64-bit Support

If you provide counters on a 64-bit computer, you must install both the 32-bit and 64-bit version of your provider on the computer if you want to support both 32-bit and 64-bit consumers. Place the 32-bit version in the %windir%\syswow64 folder and the 64-bit version in the %windir%\system32 folder.
О чём хоть они здесь толкуют-то? Или здесь не для тех написано, кто хочет просто прочитать значение какого-то одного конкретного счётчика, а для тех, кто собирается разрабатывать большую сложную программу, которая будет предоставлять пользователю (provide counters) значения всех счётчиков? И тогда значит надо будет (во время установки) поместить два варианта этой программы в две указанные выше папки. Так что ли?

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

Но всё-таки, дадим старине PDH последний шанс реабилитироваться!
Снова погружаюсь в анализ...
0
Эксперт по электронике
6562 / 3189 / 335
Регистрация: 28.10.2011
Сообщений: 12,474
Записей в блоге: 7
05.04.2020, 19:16
Кстати внизу темы находится ссылка Определить загруженность ядер процессора
Проверил, нормально работает.
Кликните здесь для просмотра всего текста
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Import "Kernel32.lib"
  GetSystemTimes(*lpIdleTime, *lpKernelTime, *lpUserTime)
EndImport
 
Define.FILETIME idle, prev_idle, kernel, prev_kernel, user, prev_user
 
GetSystemTimes(prev_idle, prev_kernel, prev_user)
Delay(1000)
 
Repeat
  GetSystemTimes(idle, kernel, user)
  sys.q = (PeekQ(user)-PeekQ(prev_user)) + (PeekQ(kernel)-PeekQ(prev_kernel))
  
  Debug Str((sys - PeekQ(idle) + PeekQ(prev_idle)) * 100.0 / sys)+" %"
  
  prev_idle = idle
  prev_kernel = kernel
  prev_user = user
  Delay(1000)
ForEver
Перевести на VB или PowerBasic думаю будет не сложно.
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
05.04.2020, 19:34  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Есть простой код загрузки CPU. Правда, показания расходятся чуток, но зато очень простой в реализации, для домашнего пользования пойдет:
На самом деле, идеально! Супер!!!
Программу запустил, показатель загрузки процессора меняется в текстбоксе через заданный пользователем интервал.
Вот именно как раз что-такое мне и было нужно в самом начале этой ветки.

Ну пожалуй, остановлюсь на этом варианте как на рабочей версии.

P.S. Но всё-таки попробую ещё немного поковыряться в PHD, может быть ещё нарою что-то путное.
А то ведь жалко потраченного (впустую?) времени, да и разогнался я уже, тащит меня по инерции, сразу вот так трудно остановиться
Особенно сейчас, когда замаячили-таки проблески света в конце тоннеля

Добавлено через 3 минуты
Цитата Сообщение от locm Посмотреть сообщение
Кстати внизу темы находится ссылка Определить загруженность ядер процессора
Проверил, нормально работает.
Кликните здесь для просмотра всего текста
Перевести на VB или PowerBasic думаю будет не сложно.
Не, ну это же, практически, тот же способ, что и во втором посте этой ветки, но только там уже с переводом
0
Эксперт по электронике
6562 / 3189 / 335
Регистрация: 28.10.2011
Сообщений: 12,474
Записей в блоге: 7
05.04.2020, 20:26
Цитата Сообщение от Power_Basic Посмотреть сообщение
Не, ну это же, практически, тот же способ, что и во втором посте этой ветки,
Незаметил тот код. Чем он не подошел?
Можно еще NtQuerySystemInformation использовать.
Кликните здесь для просмотра всего текста
PureBasic
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
Structure SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION Align #PB_Structure_AlignC
  IdleTime.LARGE_INTEGER
  KernelTime.LARGE_INTEGER
  UserTime.LARGE_INTEGER
  DpcTime.LARGE_INTEGER
  InterruptTime.LARGE_INTEGER
  InterruptCount.l
EndStructure
 
MAX_PROCESSOR = CountCPUs()
#SystemProcessorPerformanceInformation = 8
 
Dim ProcessorInfo.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION(MAX_PROCESSOR-1)
Dim ProcessorInfo_Old.SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION(MAX_PROCESSOR-1)
 
Repeat
  NtQuerySystemInformation_(#SystemProcessorPerformanceInformation, @ProcessorInfo(), 
                            SizeOf(SYSTEM_PROCESSOR_PERFORMANCE_INFORMATION) * MAX_PROCESSOR, 0)
  
  Cpu.d=0
  
  For i=0 To MAX_PROCESSOR-1
      
    sys.q = (PeekQ(ProcessorInfo(i)\UserTime)-PeekQ(ProcessorInfo_Old(i)\UserTime)) + 
            (PeekQ(ProcessorInfo(i)\KernelTime)-PeekQ(ProcessorInfo_Old(i)\KernelTime))
    
    Cpu + ((sys - PeekQ(ProcessorInfo(i)\IdleTime) + PeekQ(ProcessorInfo_Old(i)\IdleTime)) * 100.0 / sys)
  Next
  
  Debug Cpu / MAX_PROCESSOR
  
  CopyArray(ProcessorInfo(), ProcessorInfo_Old())
  Delay(1000)
ForEver
0
 Аватар для Power_Basic
46 / 25 / 0
Регистрация: 08.03.2016
Сообщений: 443
05.04.2020, 21:43  [ТС]
Цитата Сообщение от locm Посмотреть сообщение
Незаметил тот код. Чем он не подошел?
Да вроде показалось тогда, что там это выглядит каким-то обходным маневром, "танцем с бубном":

Visual Basic
1
CPU_Percent = ((Total_Time - Idle_Time) / Total_Time) * 100
а в PDH это выглядело как-то более солидно что ли. Ну типо, сразу напрямую запрашиваем и получаем нужное значение счётчика.
Я же ещё не знал на тот момент, насколько это глубокое болото

Цитата Сообщение от locm Посмотреть сообщение
Можно еще NtQuerySystemInformation использовать.
Не, мне пока и без того достаточно "информации к размышлению"
Для начала ещё пару деньков поковыряюсь с PDH. Ну а потом одно из двух: либо меня всю оставшуюся жизнь будет тошнить от упоминания это аббривиатуры, либо я научусь-таки получать значения любых счётчиков производительности напрямую, без танцев с бубном, и это будет реально круто
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2020, 21:43
Помогаю со студенческими работами здесь

Загруженность процессора 50%
Доброго времени суток! Сегодня появилась такая проблема - svchost.exe грузит процессор на 50%. Поискал в интернете решение проблемы:...

Windows 7 Загруженность процессора
ставил как x86 так и x64 постоянно не с того ни с сего грузится проц, сборка 7600 рус, активированная, на бета - версиях вроде таког оне...

Не понятная загруженность процессора.!
Всем здравствуйте. Несколько дней назад возникла такая странность: Постоянно системный процесс NT Kernel &amp; System загружает мой 4-х...

Загруженность процессора на 100%
Вообщем проблема у меня такая... винда 7 64 бит. всё работает отлично НО когда я запускаю игру минут так через 5 проц начинает грузится на...

Влияет ли ОС на загруженность процессора?
Влияет ли ОС на процессор(то есть если я установлю вместо WIndows 7 Windows Xp, нагрузка на проц будет меньше?)


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru