Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить загруженность ЦП [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]

Немного перефразирую свой вопрос:
Как можно получить для процесса время ЦП?


Наверх

Титульная страница Поиск, карта сайта Написать письмо