Форум: "Начинающим";
Текущий архив: 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