Замір ступеня використання процесора h2>
Нещодавно
в статті, присвяченій недокументовані можливості Windows, я виявив
цікавий спосіб вимірювання ступеня використання процесора. Справа в тому, що в
Windows 9x існують лічильники Performance Counters, які можна включити з
реєстру, і до реєстру ж вони будуть посилати результати вимірів. Наприклад
завантаженості процесора. Є вони і в NT, але доступ до них складніше. P>
До
мій власний подив результат перекладу С на людський VB відмінно
заробив! По-цьому, якщо Вашій програмі потрібно знати завантаженість проца, або
якщо Ви зацікавитесь доступом до реєстру з WinApi32, то Ви можете
познайомитися з простеньким прикладом. Зрозуміло в повному варіанті потрібно було
б вставити перевірку типу Windows (наприклад через GetWindowsVersion),
згортання в SysTray і т.п., але в "скороченому" вигляді Вам буде
простіше пристосувати дану фічу Windows до своїх потреб. p>
Отже.
Якщо у Вас не NT. Розташуйте на формі кнопочку. Назвемо її cmdStart. Як
водиться, у розділ General Declarations вставляємо: p>
Відкрити
потрібний ключ: p>
Private Declare Function
RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (_ p>
ByVal hkey As Long, _ p>
ByVal pSubKey As String, _ p>
ByVal ulOptions As Long, _ p>
ByVal samDesired As Long, _ p>
phkResult As Long) As Long p>
hkey, lpSubKey - шляхи до
ключу, p>
ulOptions
- Зарезервовано: має бути нуль, p>
samDesired
- Тип доступу: комбінація зумовлених констант, p>
phkResult
- Змінна, яка одержує Хендлі потрібного ключа. Не забудьте потім закрити. P>
Отримати
тип і значення параметра з раніше відкритого ключа: p>
Private Declare Function
RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA"
(_ P>
ByVal hkey As Long, _ p>
ByVal lpValueName As String, _ p>
ByVal lpReserved As Long, _ p>
lpType As Long, _ p>
lpData As Any, _ p>
lpcbData As Long) As Long p>
hkey
- Хендлі раніше відкритого ключа, p>
lpValueName
- Ім'я параметра, який потрібно прочитати, p>
lpReserved
- Зарезервовано: має бути нуль, p>
lpType
- Змінна, в яку буде повертатися тип параметра p>
можна
передати нуль, якщо тип не потрібно (нам, до речі, передасть 3 - REG_BINARY), p>
lpData
- Те, що нас цікавить, p>
lpcbData
- Змінна, яка містить довжину буфера під lpData, p>
після
виконання буде містити кількість насправді переданих байт p>
у
нас - довжина слова: 4. Якщо змінну замінити просто на 4 - теж працює p>
Закриття раніше відкритого ключа: p>
Private Declare Function RegCloseKey
Lib "advapi32.dll" (ByVal hkey As Long) As Long p>
Деякі
константи з API Viewer: p>
Private Const HKEY_DYN_DATA =
& H80000006 p>
Private Const STANDARD_RIGHTS_ALL =
& H1F0000 p>
Private Const READ_CONTROL =
& H20000 p>
Private Const STANDARD_RIGHTS_READ =
(READ_CONTROL) p>
Private Const KEY_QUERY_VALUE =
& H1 p>
Private Const KEY_SET_VALUE =
& H2 p>
Private Const KEY_CREATE_SUB_KEY =
& H4 p>
Private Const KEY_ENUMERATE_SUB_KEYS
= & H8 p>
Private Const KEY_NOTIFY = & H10 p>
Private Const KEY_CREATE_LINK =
& H20 p>
Private Const SYNCHRONIZE =
& H100000 p>
Private Const KEY_ALL_ACCESS =
((STANDARD_RIGHTS_ALL OR _ p>
KEY_QUERY_VALUE OR KEY_SET_VALUE OR
_ p>
KEY_CREATE_SUB_KEY Or
KEY_ENUMERATE_SUB_KEYS Or _ p>
KEY_NOTIFY Or KEY_CREATE_LINK) And
(Not SYNCHRONIZE)) p>
Private Const KEY_READ =
((STANDARD_RIGHTS_READ Or _ p>
KEY_QUERY_VALUE Or
KEY_ENUMERATE_SUB_KEYS Or _ p>
KEY_NOTIFY) And (Not SYNCHRONIZE)) p>
Для
службових потреб: p>
Самий
ресурсощедящій спосіб вичекати паузу (в мілісекундах): p>
Private Declare Sub Sleep Lib
"kernel32" (ByVal dwMilliseconds As Long) p>
Завжди стане в нагоді: p>
Private Declare Function
SetWindowPos Lib "user32" (ByVal hwnd As Long, _ p>
ByVal hWndInsertAfter As Long, _ p>
ByVal x As Long, _ p>
ByVal y As Long, _ p>
ByVal cx As Long, _ p>
ByVal cy As Long, _ p>
ByVal WFlags As Long) As Long p>
А це
наше: p>
Dim hkey As Long p>
Dim dwCPUUsage As Long p>
Dim lpcbData As Longпо-моєму дійсно краще
викинути, p>
підставивши
в потрібних місцях 4. Ау, теоретики! P>
Dim bStart As Boolean p>
Private Sub Form_Load () p>
SetWindowPos Me.hwnd, -1, 0, 0, 0,
0, 3 p>
бачимо завжди p>
End Sub p>
Private Sub cmdStart_Click () p>
bStart = Not bStart p>
bStart
- Це Вкл-Викл. Див далі p>
If bStart Then p>
якщо - True - починаємо p>
cmdStart.Caption
= "& Stop" p>
міняємо
назва кнопочки p>
Включаємо
лічильник, зчитуючи значення відповідного ключа: p>
If RegOpenKeyEx (HKEY_DYN_DATA,
"PerfStatsStartStat", 0, KEY_ALL_ACCESS, _ p>
hkey) <> 0 Then Exit Sub p>
lpcbData = 4 p>
RegQueryValueEx hkey,
"KERNELCPUUsage", 0, 0, dwCPUUsage, lpcbData p>
RegCloseKey
hkey p>
закрити
ключ p>
Прочитуємо
значення прямо з реєстру: p>
If RegOpenKeyEx (HKEY_DYN_DATA,
"PerfStatsStatData", 0, KEY_READ, _ p>
hkey) <> 0 Then Exit Sub p>
Do While bStart p>
поки
ще раз не натиснемо на кнопочку < p>
RegQueryValueEx hkey,
"KERNELCPUUsage", 0, 0, dwCPUUsage, lpcbData p>
Sleep 500 p>
інтервал опитування - півсекунди p>
Caption = Str $ (dwCPUUsage) &
"%" p>
Любуємося !!! p>
DoEvents p>
даємо жити p>
Loop p>
RegCloseKey hkey p>
закрити
ключ p>
зупиняємо
лічильник. Якщо Ви перервали виконання програми p>
до
цього моменту, зупинити лічильник можна тільки перезавантажити !!! p>
Перевірено :(( p>
If RegOpenKeyEx (HKEY_DYN_DATA,
"PerfStatsStopStat", 0, KEY_ALL_ACCESS, _ p>
hkey) <> 0 Then Exit Sub p>
lpcbData = 4 p>
RegQueryValueEx hkey,
"KERNELCPUUsage", 0, 0, dwCPUUsage, lpcbData p>
RegCloseKey hkey p>
пам'ятаємо завжди! p>
Else p>
cmdStart.Caption = "& Start" p>
міняємо
назва кнопочки і ... p>
Caption
= "Stoped ..." p>
НЕ
даємо собі впасти у зневіру дивлячись на завислі 100% p>
End If p>
End Sub p>
Private Sub Form_Unload (Cancel As
Integer) p>
If bStart Then p>
cmdStart_Click p>
End If p>
ледачі
мене зрозуміють ;-) p>
End
Sub p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://visualprogs.narod.ru/
p>