![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить загруженность ЦП [D7, XP]
Gloomer © (2006-10-08 16:37:00)Как получить загруженность ЦП конкртетным процессом (как это делается в Диспетчере задач - Процессы)
Ketmar (2006-10-09 16:22:00) [1]"мало" -- не значит "никогда не будет". %-)
Gloomer (2006-10-09 16:21:00) [2]2 Ketmar[8]
Замечание верное, но я уже и сам до этого дошел. Но вероятность этого при инициализации очень мала, а при работе по таймеру в знаменателе как минимум будет 10. Хотя последовательный двойной вызов функции может привести к любимой ошибке деления на ноль %-)
Ketmar (2006-10-09 16:08:00) [3]вообще-то ещё рекомендуют проверять, не поделится ли случайно на ноль. %-)
Gloomer (2006-10-09 15:59:00) [4]Ну виноват...
у себя я уже давно это заметил и исправил
Result:=-1;
PH:=OpenProcess(PROCESS_QUERY_INFORMATION,true,Pid);
if ph=0 then exit;
if GetProcessTimes(PH,t1,t2,t3,t4) then
begin
tek_t:=(0.0+t3.dwLowDateTime+t4.dwLowDateTime+4294967296.0*(t3.dwHighDateTime+t4.dwHighDateTime))/100.0;
tek_cnt:=GetTickCount;
Result:=Round((tek_t-pred_t)/(tek_cnt-pred_cnt));
pred_t:=tek_t;
pred_cnt:=tek_cnt;
end;
CloseHandle(PH);
Ketmar (2006-10-09 15:55:00) [5]>[5] learner(c) 9-Oct-2006, 15:49
>Ну и наплодится же у тебя хендлов открытых процессов :))
не так уж много. начнёт тормозить, в конце концов (хоть и не очень быстро) просто обломится процессы открывать. %-)
learner (2006-10-09 15:49:00) [6]Ну и наплодится же у тебя хендлов открытых процессов :))
Gloomer (2006-10-09 15:26:00) [7]Т.к. никто конкретного ответа не дал и в инете готовых решений я не нашел, то привожу своё решение (на оптимальность кода не претендую, но может кому еще понадобится)
...
var //глобальное объявление переменных
...
pred_t:extended;
pred_cnt:cardinal;
...
function GetCPUProc(pid:THandle):integer;
var PH:THandle;
t1,t2,t3,t4:TFileTime;
tek_t:extended;
tek_cnt:cardinal;
begin
result:=-1;
PH:=OpenProcess(PROCESS_QUERY_INFORMATION,true,pid);
if ph=0
then exit;
if not GetProcessTimes(ph,t1,t2,t3,t4)
then exit;
tek_t:=(0.0+t3.dwLowDateTime+t4.dwLowDateTime+4294967296.0*(t3.dwHighDateTime+t4.dwHighDateTime))/100.0;
tek_cnt:=GetTickCount;
result:=round((tek_t-pred_t)/(tek_cnt-pred_cnt));
pred_t:=tek_t;
pred_cnt:=tek_cnt;
end;
Работает только на WinNT (Win2k3 не проверял)
Вызывать функцию можно по таймеру - период таймера не важен. Результат - срезняя загрузка ЦП процессом за время с предыдущего запуска функции. Первое возвращенное значение может быть любым.
-1 - скорее всего неверный PID процесса;
Пример:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Edit1.Text:=IntToStr(GetCPUProc(4));
end;
Ketmar (2006-10-09 00:00:00) [8]Рихтер -- jobs. WMI. NtQuery<какая-то-там-информация>(). %-)
лучше -- WMI.
ProgRAMmer Dimonych (2006-10-08 23:21:00) [9]Раздел справки WinSDK "Processes and Threads"?
Gloomer (2006-10-08 21:17:00) [10]Немного перефразирую свой вопрос:
Как можно получить для процесса время ЦП?