Замір ступеня використання процесора, Basic, Програмування, статті

Касирів М., Азбука Visual Basic

Нещодавно в статті, присвяченій недокументированним можливостям Windows, Я виявив цікавий спосіб вимірювання ступеня використання процесора. Справа в тому, що в Windows 9x існують лічильники Performance
Counters
, Які можна включити з реєстру, і до реєстру ж вони будуть посилати результати вимірів. Наприклад завантаженості процесора. Є вони і в NT, Але доступ до ним складніше.
На мій власний подив результат перекладу З на людський VB відмінно заробив! По-цьому, якщо Вашій програмі потрібно знати завантаженість проца, або якщо Ви зацікавитесь доступом до реєстру з WinApi32, то Ви можете познайомитися з простеньким прикладом. Зрозуміло в повному варіанті потрібно було б вкласти перевірку типу Windows (Наприклад через GetWindowsVersion), згортання в SysTray і т.п., але в “скороченому” вигляді Вам буде простіше пристосувати дану фічу Windows до своїх потреб.
Отже. Якщо у Вас не NT. Розташуйте на формі кнопочку. Назвемо її cmdStart. Як водиться, в розділ General
Declarations
вставляємо:

‘Відкрити потрібний ключ:
Private
Declare Function RegOpenKeyEx
Lib
"advapi32.dll"
Alias
"RegOpenKeyExA" ( _
ByVal
hkey
As Long
, _
ByVal
pSubKey
As String
, _
ByVal
ulOptions
As Long
, _
ByVal
samDesired
As Long
, _
phkResult
As Long)
As Long

‘hkey, lpSubKey – шляхи до ключа,
‘UlOptions – зарезервовано: має бути нуль,
‘SamDesired – тип доступу: комбінація зумовлених констант,
‘PhkResult – змінна, яка отримує хендл потрібного ключа. Чи не забудьте потім закрити.

‘Отримати тип і значення параметра з раніше відкритого ключа:
Private
Declare Function RegQueryValueEx
Lib
"advapi32.dll"
Alias
"RegQueryValueExA" ( _
ByVal
hkey
As Long
, _
ByVal
lpValueName
As String
, _
ByVal
lpReserved
As Long
, _
lpType
As Long,
_
lpData
As Any,
_
lpcbData
As Long)
As Long

‘hkey – Хендл відкритого раніше ключа,
‘LpValueName – ім’я параметра, який потрібно прочитати,
‘LpReserved – зарезервовано: має бути нуль,
‘LpType – змінна, в яку буде повертатися тип параметра
‘Можна передати нуль, якщо тип не потрібно (нам, до речі, передасть 3 – REG_BINARY),
‘LpData – те, що нас цікавить,
‘LpcbData – змінна, яка містить довжину буфера під lpData,
‘Після виконання буде містити кол-во в дійсності переданих байт
‘У нас – довжина слова: 4. Якщо змінну замінити просто на 4 – Теж працює

‘Закриття раніше відкритого ключа:

Private
Declare Function RegCloseKey
Lib
"advapi32.dll" (
ByVal
hkey
As Long
)
As Long

‘Деякі константи з API Viewer:

Private
Const HKEY_DYN_DATA =
&H80000006

Private
Const
STANDARD_RIGHTS_ALL = &H1F0000
Private
Const READ_CONTROL =
&H20000
Private
Const
STANDARD_RIGHTS_READ = (READ_CONTROL)
Private
Const KEY_QUERY_VALUE
= &H1
Private
Const KEY_SET_VALUE =
&H2
Private
Const
KEY_CREATE_SUB_KEY = &H4
Private
Const
KEY_ENUMERATE_SUB_KEYS = &H8
Private
Const KEY_NOTIFY =
&H10
Private
Const KEY_CREATE_LINK
= &H20
Private
Const SYNCHRONIZE =
&H100000

Private
Const KEY_ALL_ACCESS
= ((STANDARD_RIGHTS_ALL
OR
_
KEY_QUERY_VALUE
OR KEY_SET_VALUE
OR
_
KEY_CREATE_SUB_KEY
Or
KEY_ENUMERATE_SUB_KEYS
Or
_
KEY_NOTIFY
Or
KEY_CREATE_LINK)
And (
Not
SYNCHRONIZE))
Private
Const KEY_READ =
((STANDARD_RIGHTS_READ
Or
_
KEY_QUERY_VALUE
Or
KEY_ENUMERATE_SUB_KEYS
Or
_
KEY_NOTIFY)
And (
Not
SYNCHRONIZE))

‘Для службових потреб:

‘Самий ресурсощедящій спосіб вичекати паузу (в мілісекундах):

Private
Declare Sub Sleep
Lib
"kernel32" (
ByVal
dwMilliseconds
As Long
)

‘Завжди стане в нагоді:
Private
Declare Function
SetWindowPos
Lib
"user32" (
ByVal
hwnd As
Long, _
ByVal
hWndInsertAfter
As Long
, _
ByVal
x
As Long
, _
ByVal
y
As Long
, _
ByVal
cx
As Long
, _
ByVal
cy
As Long
, _
ByVal
WFlags
As Long
)
As Long

‘А це наше:
Dim
hkey
As Long

Dim
dwCPUUsage
As Long

Dim
lpcbData
As Long ‘По-моєму дійсно краще викинути,

‘Підставивши в потрібних місцях 4. Ау, теоретики!

Dim
bStart
As Boolean

Private

Sub
Form_Load()
SetWindowPos Me.hwnd, -1, 0, 0, 0, 0, 3
‘Бачимо завжди
End
Sub

Private
Sub cmdStart_Click()
bStart =
Not
bStart
‘bStart – Це Вкл-Викл. Див. далі

If
bStart
Then

‘Якщо – True – починаємо>
cmdStart.Caption = "&Stop"
‘Міняємо назва кнопочки

‘Включаємо лічильник, зчитуючи значення відповідного ключа:

If
RegOpenKeyEx(HKEY_DYN_DATA,
"PerfStats\StartStat", 0, KEY_ALL_ACCESS, _
hkey) <> 0
Then Exit Sub

lpcbData = 4
RegQueryValueEx hkey, "KERNEL\CPUUsage", 0, 0,
dwCPUUsage, lpcbData
RegCloseKey hkey
‘Закрити ключ
‘Прочитуємо значення прямо з реєстру:

If
RegOpenKeyEx(HKEY_DYN_DATA,
"PerfStats\StatData", 0, KEY_READ, _
hkey) <> 0
Then Exit Sub

Do
While bStart
‘Поки ще раз не натиснемо на кнопочку
>     <
RegQueryValueEx hkey, "KERNEL\CPUUsage", 0, 0,
dwCPUUsage, lpcbData
Sleep 500
‘Інтервал опитування – півсекунди>
Caption = Str$(dwCPUUsage) & "%"
‘Любуємося!

DoEvents

‘Даємо жити
>Loop

RegCloseKey hkey
‘Закрити ключ

‘Зупиняємо лічильник. Якщо Ви перервали виконання програми
‘До цього моменту, зупинити лічильник можна тільки перезавантажитеся!
‘Перевірено: ((
If
RegOpenKeyEx(HKEY_DYN_DATA,
"PerfStats\StopStat", 0, KEY_ALL_ACCESS, _
hkey) <> 0
Then Exit Sub

lpcbData = 4
RegQueryValueEx hkey, "KERNEL\CPUUsage", 0, 0,
dwCPUUsage, lpcbData
RegCloseKey hkey
‘Пам’ятаємо завжди!
Else

cmdStart.Caption = "&Start"
‘Міняємо назва кнопочки і …

Caption = "Stoped…"
‘Не даємо собі впасти у зневіру дивлячись на завислі 100%

End
If
End
Sub

Private
Sub
Form_Unload(Cancel As Integer)
If
bStart
Then

cmdStart_Click
End
If
‘Ледачі мене зрозуміють 😉

End
Sub

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*