РефератыИнформатика, программированиеЗаЗамер степени использования процессора

Замер степени использования процессора

Недавно в статье, посвящённой недокументированным возможностям 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


DimlpcbDataAsLongпо-моему действительно лучше выкинуть,


подставив в нужных местах 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, "PerfStatsStartStat", 0, KEY_ALL_ACCESS, _


hkey) <> 0 Then Exit Sub


lpcbData = 4


RegQueryValueEx hkey, "KERNELCPUUsage", 0, 0, dwCPUUsage, lpcbData


RegCloseKey hkey


закрыть ключ


Считываем значение прямо из реестра:


If RegOpenKeyEx(HKEY_DYN_DATA, "PerfStatsStatData", 0, KEY_READ, _


hkey) <> 0 Then Exit Sub


Do While bStart


пока ещё раз не нажмём на кнопочку <


RegQueryValueEx hkey, "KERNELCPUUsage", 0, 0, dwCPUUsage, lpcbData


Sleep 500


интервал опроса - полсекунды


Caption = Str$(dwCPUUsage) & "%"


Любуемся!!!


DoEvents


даём жить


Loop


RegCloseKey hkey


закрыть ключ


останавливаем счётчик. Если Вы прервали выполнение программы


до этого момента, остановить счётчик можно только перезагрузившись!!!


Проверено:((


If RegOpenKeyEx(HKEY_DYN_DATA, "PerfStatsStopStat", 0, KEY_ALL_ACCESS, _


hkey) <> 0 Then Exit Sub


lpcbData = 4


RegQueryValueEx hkey, "KERNELCPUUsage", 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

Сохранить в соц. сетях:
Обсуждение:
comments powered by Disqus

Название реферата: Замер степени использования процессора

Слов:755
Символов:7167
Размер:14.00 Кб.