Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизПамять и Время Найти похожие ветки
← →
DeadMeat © (2004-06-30 23:10) [0]Здрассте всем тут... У меня проблемка образовалась такая вот. Надо получить список процессов (это я могу) в котором будет показываться, скока каждый процесс ест процессорного времени. В хелпе смотрел (по toolhelp32) и не нашёл. Мож плохо смотрел? Тогда ткните меня (или в меня) пальцем поЗалуста... Благодарен за любую информацию.
← →
Digitman © (2004-07-01 11:07) [1]
> ткните
эт запросто, эт не заржавеет
GetProcessTimes()
Get = получить
Process = процесс
Times = времена (показатели времени)
даже при знании аглицкого на пять баллов сообразить, по каким ключевым словам следует шарить в справке, чрезвычайно сложно
← →
DeadMeat © (2004-07-01 15:13) [2]Видимо я неверно сформулировал вопрос... Мне не надо получать время, которое процесс работал и т.п. Мне надо получить скока в процентах ест конкретный процесс процессорного времени..., т.е. к примеру если запустить процесс, в котором есть такая вот строчка
while true do;
, то он займет 100 процентов всего процессорного времени... Вот это мне и надо узнать для конкретного процесса...
Извиняюсь, если не верно объяснил суть...
← →
Тимохов © (2004-07-01 15:16) [3]
> то он займет 100 процентов всего процессорного времени
кто вам это сказал.
что в вашем понимании есть процессорное время?
в чем проблема: с помощью приведенной функции определяете сколько работал процесс, делите не общее время, умножаете на 100. Чем не процент.
← →
Digitman © (2004-07-01 15:26) [4]
> DeadMeat © (01.07.04 15:13) [2]
> получить скока в процентах ест конкретный процесс процессорного
> времени
(user_time / (user_time + kernel_time)) * 100
← →
DeadMeat © (2004-07-01 15:28) [5]Похоже не хватает у меня лексикона, чтобы сформулировать вопрос верно...
> [3] Тимохов © (01.07.04 15:16)
Напишите это в Delphi, запустите и откройте TaskMgr... В столбике ЦП на вашем процессе будет число в интервале 97-99... Вот именно это мне и надо узнать, только для конкретного процесса...
Надеюсь сейчас правильно объяснил...
← →
ПЛОВ (2004-07-01 16:16) [6]
> в чем проблема: с помощью приведенной функции определяете
> сколько работал процесс, делите не общее время, умножаете
> на 100. Чем не процент.
Интерестно вы ставите вопрос...
А если все это время процесс не работал а висел в памяти а в последние 2 минуты ему приспичело > while true do
← →
Тимохов © (2004-07-01 16:43) [7]
> ПЛОВ (01.07.04 16:16) [6]
> Интерестно вы ставите вопрос...
Ну так в среднем получится - средний процент загрузки данными процессом процессора за год. Чем не показатель? :)))
Согласен, не совсем то, что нужно :)
← →
Digitman © (2004-07-01 17:03) [8]
> DeadMeat © (01.07.04 15:28) [5]
> Похоже не хватает у меня лексикона,
а вот чтобы его хватало, ты должен не полениться и почитать теорию по Win32 ... отправная точка для поиска - та самая ф-ция, которую я тебе привел ... там фигурируют термины kernel-time и user-time .. от них и пляши ... пока не поймешь, что это и чем отличается, так и будешь долдонить про свои 100% - ни понимание сути и дело от этого не двинутся с места
← →
Тимохов © (2004-07-01 17:21) [9]
> Digitman © (01.07.04 17:03) [8]
> (user_time / (user_time + kernel_time)) * 100
Вот эту формулу вы сами придумали? Или это есть определение термина "процент потребления процессом процессорного времени"?
Т.е. иниыми словам - эта формула есть значение "Время ЦП" в диспетчере задач?
← →
Тимохов © (2004-07-01 17:23) [10]
> Тимохов © (01.07.04 17:21) [9]
ой, не так
Т.е. иниыми словам - эта формула есть значение "ЦП" в диспетчере задач?
← →
Digitman © (2004-07-01 17:37) [11]
> Тимохов © (01.07.04 17:23) [10]
не знаю я, какая уж там "формула", но пустой цикл while True do потребляет исключительно user-time
в состояние же kernel-time процесс переходит, в первую очередь, в момент вызова трэдами API-ф-ций приостановки (sleep) и ожидания (WaitMessage, GetMessage и т.п.)
← →
Тимохов © (2004-07-01 17:41) [12]
> не знаю я, какая уж там "формула",
Просто вы так уверенно ответили, что подумал, что где-то видели описание того, что выводится в диспетчере задач. Скажу честно, я до сих пор не понимю многого, что там видно.
← →
Digitman © (2004-07-02 08:15) [13]
> Тимохов © (01.07.04 17:41) [12]
ну вообще-то это кажется очевидным ..
общее время, распределенное процессу с момента
LPFILETIME lpCreationTime, // when the process was created
складывается из двух составляющих :
LPFILETIME lpKernelTime, // time the process has spent in kernel mode
LPFILETIME lpUserTime // time the process has spent in user mode
отношение lpUserTime к суммарному времени, приведенное к процентному виду, и есть тот самый "процент загруженности", взятый в момент выполнения такого расчета
← →
False_Delirium © (2004-07-02 11:45) [14]2Digitman, если верить твоему объяснению и TaskManager пользовался бы приведённой формулой, то колонка CPU уже никогда не смогла бы стать равной нулю после старта приложения.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/perfmon/base/performance_monitoring_functions.asp
это то, что предоставляет MicroSoft и чем пользуется сам SysMon.
← →
Digitman © (2004-07-02 14:27) [15]
> False_Delirium © (02.07.04 11:45) [14]
> то колонка CPU уже никогда не смогла
> бы стать равной нулю после старта приложения.
а мозгами воспользоваться ?
это что, нужно объяснять, что при расчете по такой формуле используются, разумеется, не абс.значения времен пользователя и ядра (взятые "в лоб" из рез-тов вызовов GetProcessTimes), а их дельты ?
← →
DeadMeat © (2004-07-02 18:50) [16]Вообщем если я всё правильно понял, то должно получиться нечто вроде этого:
.....
var
Form1: TForm1;
usertim,kerneltim:int64;
usertim0,kerneltim0:int64;
.....
procedure TForm1.Timer1Timer(Sender: TObject);
var kr,us:_large_integer;
usertim1,kerneltim1:int64;
res:integer;
crt,ext,ker,usr:_filetime;
begin
getprocesstimes (openprocess (PROCESS_QUERY_INFORMATION,false,getcurrentprocessid),crt,ext,ker,usr);
us.LowPart:=usr.dwLowDateTime;
us.HighPart:=usr.dwHighDateTime;
kr.LowPart:=ker.dwLowDateTime;
kr.HighPart:=ker.dwHighDateTime;
usertim:=us.QuadPart;
kerneltim:=kr.QuadPart;
usertim1:=usertim-usertim0;
kerneltim1:=kerneltim-kerneltim0;
if usertim1<>0 then res:=round ((usertim1/(usertim1+kerneltim1+1))*100) else res:=0;
usertim0:=usertim;
kerneltim0:=kerneltim;
caption:=inttostr (res);
end;
.....
Стиль написания особо сильно не критикуйте... Писал наспех...
Циферки немного разняться между этими и в ProcessExplorer... Как я понимаю - это из-за того, что время вызова GetProcessTimes разное у меня и у него, или я опять чего-то не понял???
---
...Death Is Only The Begining...
← →
Digitman © (2004-07-03 12:24) [17]зачем при каждом тике таймера открывать заново процесс ?
открой его один раз и при тике только считывай времена, хэндл у тебя уже есть
к тому же приоритет твоего процесса и кодового потока, в котором ты обращаешься к GetProcessTimes(), вряд ли соответствуют приоритетам того же штатного Process Exlorer"а
← →
DeadMeat © (2004-07-03 18:34) [18]> зачем при каждом тике таймера открывать заново процесс ?
Этота понятно... В любом случае мне надо туда подставлять PID-ы из списка...
> к тому же приоритет твоего процесса и кодового потока, в котором ты обращаешься к GetProcessTimes(), вряд ли соответствуют приоритетам того же штатного Process Exlorer"а
Примерно как я и думал...
Вообщем спасибо всем... И вам уважаемый Digitman за помощь...
---
...Death Is Only The Begining...
← →
DeadMeat © (2004-07-03 18:57) [19]> Этота понятно... В любом случае мне надо туда подставлять PID-ы из списка...
С другой стороны, проще будет подставлять HPROCESS из списка вместо PID-ов...
---
...Death Is Only The Begining...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.05 c