Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.10.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.051 c
1-1158052079
Моновар
2006-09-12 13:07
2006.10.22
Вопрос по TreeView


15-1159464002
ArtemESC
2006-09-28 21:20
2006.10.22
С++


15-1159794489
TStas
2006-10-02 17:08
2006.10.22
Стоит ли шифровать dll ку


2-1160377062
Gloomer
2006-10-09 10:57
2006.10.22
Права доступа при открытии процесса


15-1159269184
Knight
2006-09-26 15:13
2006.10.22
Программы направления "Домашняя бухгалтерия"





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский