|
Вопрос # 2 895/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Сразу прошу прощения за такой дурной вопрос. Но мне очень нужно разобраться в коде, который осуществляет определение загрузки центрального процессора. Понять сам алгоритм, как происходит определение этого значения.
Заранее благодарю за ответы!
Приложение: Переключить в обычный режим-
- function GetCPUUsage: Integer;
- var
- SysBaseInfo: TSystem_Basic_Information;
- SysPerfInfo: TSystem_Performance_Information;
- SysTimeInfo: TSystem_Time_Information;
- status: Longint;
- dbSystemTime: Double;
- dbIdleTime: Double;
- begin
- if @NtQuerySystemInformation = nil then
- NtQuerySystemInformation := GetProcAddress(GetModuleHandle('ntdll.dll'),
- 'NtQuerySystemInformation');
- status := NtQuerySystemInformation(0, @SysBaseInfo, SizeOf(SysBaseInfo), nil);
- if status <> 0 then Exit;
- status := NtQuerySystemInformation(3, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
- if status <> 0 then Exit;
- status := NtQuerySystemInformation(2, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
- if status <> 0 then Exit;
- liOldIdleTime := SysPerfInfo.liIdleTime;
- liOldSystemTime := SysTimeInfo.liKeSystemTime;
- Sleep(1000);
- status := NtQuerySystemInformation(3, @SysTimeInfo, SizeOf(SysTimeInfo), 0);
- if status <> 0 then Exit;
- status := NtQuerySystemInformation(2, @SysPerfInfo, SizeOf(SysPerfInfo), nil);
- if status <> 0 then Exit;
- dbIdleTime := Li2Double(SysPerfInfo.liIdleTime) - Li2Double(liOldIdleTime);
- dbSystemTime := Li2Double(SysTimeInfo.liKeSystemTime) - Li2Double(liOldSystemTime);
- dbIdleTime := dbIdleTime / dbSystemTime;
- dbIdleTime := 100 - dbIdleTime * 100;
- result:= Trunc(dbIdleTime) + Trunc (Frac(dbIdleTime) * 2);
- end;
-
 |
Вопрос задала: Insomnia (статус: Посетитель)
Вопрос отправлен: 10 июня 2009, 15:05
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Пупкин В В
Здравствуйте, Insomnia!
узнается количество процессоров
потом каждую секунду получаем время простоя и загргрузки проца т.к. винда любит считать время от "начала времен"
вычитаем получая время которое реально работает и бездействует проц
получаем соотношение времен, а затем переводим в проценты учитывая сколько у нас процессоров
вот и все
я так понял по крайней мере =)
 |
Ответ отправил: Пупкин В В (статус: 2-ой класс)
Время отправки: 10 июня 2009, 16:17
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 10 июня 2009, 16:24; участников в обсуждении: 1.
|
Пупкин В В (статус: 2-ой класс), 10 июня 2009, 16:24 [#1]:
хотя меня смущает
result:= Trunc(dbIdleTime) + Trunc (Frac(dbIdleTime) * 2);
и то что не учитываем количество процессоров
вернее тут он один наверно
код то 100% рабочий? показывает верный результат?
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|