Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.10.22;
Скачать: CL | DM;

Вниз

Как получить загруженность ЦП   Найти похожие ветки 

 
Gloomer ©   (2006-10-08 16:37) [0]

Как получить загруженность ЦП конкртетным процессом (как это делается в Диспетчере задач - Процессы)


 
Gloomer ©   (2006-10-08 21:17) [1]

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


 
ProgRAMmer Dimonych ©   (2006-10-08 23:21) [2]

Раздел справки WinSDK "Processes and Threads"?


 
Ketmar ©   (2006-10-09 00:00) [3]

Рихтер -- jobs. WMI. NtQuery<какая-то-там-информация>(). %-)
лучше -- WMI.


 
Gloomer ©   (2006-10-09 15:26) [4]

Т.к. никто конкретного ответа не дал и в инете готовых решений я не нашел, то привожу своё решение (на оптимальность кода не претендую, но может кому еще понадобится)


...
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;


 
learner ©   (2006-10-09 15:49) [5]

Ну и наплодится же у тебя хендлов открытых процессов :))


 
Ketmar ©   (2006-10-09 15:55) [6]

>[5] learner(c) 9-Oct-2006, 15:49
>Ну и наплодится же у тебя хендлов открытых процессов :))
не так уж много. начнёт тормозить, в конце концов (хоть и не очень быстро) просто обломится процессы открывать. %-)


 
Gloomer ©   (2006-10-09 15:59) [7]

Ну виноват...
у себя я уже давно это заметил и исправил

 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 16:08) [8]

вообще-то ещё рекомендуют проверять, не поделится ли случайно на ноль. %-)


 
Gloomer ©   (2006-10-09 16:21) [9]

2 Ketmar[8]
Замечание верное, но я уже и сам до этого дошел. Но вероятность этого при инициализации очень мала, а при работе по таймеру в знаменателе как минимум будет 10. Хотя последовательный двойной вызов функции может привести к любимой ошибке деления на ноль %-)


 
Ketmar ©   (2006-10-09 16:22) [10]

"мало" -- не значит "никогда не будет". %-)



Страницы: 1 вся ветка

Текущий архив: 2006.10.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.032 c
3-1155812228
Ro-man
2006-08-17 14:57
2006.10.22
Вопросы по реализации 3-х звенного приложения...


4-1149356336
oleg_SYS
2006-06-03 21:38
2006.10.22
Нажатие кнопки в чужом приложении


2-1159794603
Fantasy
2006-10-02 17:10
2006.10.22
IBDataSet1BeforePost


15-1159173745
megabyte-ceercop
2006-09-25 12:42
2006.10.22
Еще раз о траблах с линкером.


2-1159953886
pyJIoH
2006-10-04 13:24
2006.10.22
Пространство имен, пустой xmlns