Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Через 3 дня :

День славянской письменности и культуры


Использование процессорного времени


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
psa247
Гость







СообщениеСр, 31-Авг-2005 12:45    Заголовок сообщения: Использование процессорного времени
Цитата

Привет Всем!

Делаю через NtQuerySystemInformation
получаем KernelTime и UserTime типа Large_Integer

Процентное соотношение не корректное, где ошибка - не вижу.

function GetProcessCPUUsage(PID : Cardinal; KernelTime, UserTime : LARGE_INTEGER): integer;
var i : integer;
LoDWORD, HiDWORD : DWORD;
tmp, tmp2 : real;
begin
Result:= 0;
if ProcessTimersCount > 0 then
for i:= 0 to ProcessTimersCount -1 do
if ProcessTimers[i].PID = PID then begin
HiDWORD:= KernelTime.HighPart - ProcessTimers[i].KernelTime.HighPart;
LoDWORD:= KernelTime.LowPart - ProcessTimers[i].KernelTime.LowPart;
tmp:= LoDWORD + HiDWORD;// * DWORD(-1);
tmp2:= GetTickCount;// - ProcessTimers[i].Time;
Result:= Round(100 * tmp / tmp2);
if Result > 100 then Result:= 100;
ProcessTimers[i].KernelTime:= KernelTime;
ProcessTimers[i].UserTime:= UserTime;
ProcessTimers[i].Time:= ROund(tmp2);
exit;
end;
Inc(ProcessTimersCount);
SetLength(ProcessTimers, ProcessTimersCount);
ProcessTimers[ProcessTimersCount -1].PID:= PID;
ProcessTimers[ProcessTimersCount -1].KernelTime:= KernelTime;
ProcessTimers[ProcessTimersCount -1].UserTime:= UserTime;
ProcessTimers[ProcessTimersCount -1].Time:= GetTickCount;
end;
В начало
Пол:Муж Ktf
Администратор


Возраст: 32
Знак зодиака: Рак
Зарегистрирован: 15.05.2005
Сообщения: 1502
Откуда: localhost
СообщениеСр, 31-Авг-2005 13:24 
Цитата

Цитата:
tmp:= LoDWORD + HiDWORD;// * DWORD(-1);

думаю, здесь нужно вот так
Код:
tmp:= LoDWORD + HiDWORD shl 32;

_________________
Пойду посплю перед сном.
В начало
Посмотреть профиль Отправить личное сообщение
psa247
Гость







СообщениеСр, 31-Авг-2005 13:53 
Цитата

С небольшими изменениями, будет так:

tmp:= LoDWORD + HiDWORD * DWORD(-1);// shl 32;
tmp2:= GetTickCount - ProcessTimers[i].Time;
Result:= Round(tmp / tmp2 / 100);
if Result > 100 then Result:= 100;
ProcessTimers[i].KernelTime:= KernelTime;
ProcessTimers[i].UserTime:= UserTime;
ProcessTimers[i].Time:= GetTickCount;
exit;
end;

Остается глюк - Бездействие системы. По идее оно должно быть разницой м/у 100% и суммой загрузки проца на каждый процесс.
В начало
DrPass
Знающий :)
/Почетный Модератор/


Возраст: 31
Знак зодиака: Лев
Зарегистрирован: 02.05.2002
Сообщения: 5709
Откуда: Донецк
СообщениеСр, 31-Авг-2005 21:13 
Цитата

Цитата:
По идее оно должно быть разницой м/у 100% и суммой загрузки проца на каждый процесс

Так и есть. Считается вручную. Посмотри старые темы годков этак 2002-2003. Я там писал и аттачил типа "Диспетчер задач" :)

_________________
Да пребудет с вами Сила!
В начало
Посмотреть профиль Отправить личное сообщение
psa247
Гость







СообщениеЧт, 01-Сен-2005 9:35 
Цитата

Спасибо, премного благодарен Счастлив
В начало
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100