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

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

Память и Время [D6, Win95/98, WinME, NT4, Win2k, WinXP]


DeadMeat ©   (2004-06-30 23:10:00) 

Здрассте всем тут... У меня проблемка образовалась такая вот. Надо получить список процессов (это я могу) в котором будет показываться, скока каждый процесс ест процессорного времени. В хелпе смотрел (по toolhelp32) и не нашёл. Мож плохо смотрел? Тогда ткните меня (или в меня) пальцем поЗалуста... Благодарен за любую информацию.


DeadMeat   (2004-07-03 18:57:00) [1]

> Этота понятно... В любом случае мне надо туда подставлять PID-ы из списка...
С другой стороны, проще будет подставлять HPROCESS из списка вместо PID-ов...

---
...Death Is Only The Begining...


DeadMeat   (2004-07-03 18:34:00) [2]

> зачем при каждом тике таймера открывать заново процесс ?
Этота понятно... В любом случае мне надо туда подставлять PID-ы из списка...

> к тому же приоритет твоего процесса и кодового потока, в котором ты обращаешься к GetProcessTimes(), вряд ли соответствуют приоритетам того же штатного Process Exlorer'а
Примерно как я и думал...

Вообщем спасибо всем... И вам уважаемый Digitman за помощь...

---
...Death Is Only The Begining...


Digitman   (2004-07-03 12:24:00) [3]

зачем при каждом тике таймера открывать заново процесс ?
открой его один раз и при тике только считывай времена, хэндл у тебя уже есть

к тому же приоритет твоего процесса и кодового потока, в котором ты обращаешься к GetProcessTimes(), вряд ли соответствуют приоритетам того же штатного Process Exlorer'а


DeadMeat   (2004-07-02 18:50:00) [4]

Вообщем если я всё правильно понял, то должно получиться нечто вроде этого:

.....
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-02 14:27:00) [5]


> False_Delirium ©   (02.07.04 11:45) [14]
> то колонка CPU уже никогда не смогла
> бы стать равной нулю после старта приложения.


а мозгами воспользоваться ?

это что, нужно объяснять, что при расчете по такой формуле используются, разумеется, не абс.значения времен пользователя и ядра (взятые "в лоб" из рез-тов вызовов GetProcessTimes), а их дельты ?


False_Delirium   (2004-07-02 11:45:00) [6]

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 08:15:00) [7]


> Тимохов ©   (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 к суммарному времени, приведенное к процентному виду, и есть тот самый "процент загруженности", взятый в момент выполнения такого расчета


Тимохов   (2004-07-01 17:41:00) [8]


> не знаю я, какая уж там "формула",

Просто вы так уверенно ответили, что подумал, что где-то видели описание того, что выводится в диспетчере задач. Скажу честно, я до сих пор не понимю многого, что там видно.


Digitman   (2004-07-01 17:37:00) [9]


> Тимохов ©   (01.07.04 17:23) [10]


не знаю я, какая уж там "формула", но пустой цикл while True do потребляет исключительно user-time

в состояние же kernel-time процесс переходит, в первую очередь, в момент вызова трэдами API-ф-ций приостановки (sleep) и ожидания (WaitMessage, GetMessage и т.п.)


Тимохов   (2004-07-01 17:23:00) [10]


> Тимохов ©   (01.07.04 17:21) [9]

ой, не так

Т.е. иниыми словам - эта формула есть значение "ЦП"в диспетчере задач?


Тимохов   (2004-07-01 17:21:00) [11]


> Digitman ©   (01.07.04 17:03) [8]


> (user_time / (user_time + kernel_time)) * 100

Вот эту формулу вы сами придумали? Или это есть определение термина "процент потребления процессом процессорного времени"?

Т.е. иниыми словам - эта формула есть значение "Время ЦП" в диспетчере задач?


Digitman   (2004-07-01 17:03:00) [12]


> DeadMeat ©   (01.07.04 15:28) [5]
> Похоже не хватает у меня лексикона,


а вот чтобы его хватало, ты должен не полениться и почитать теорию по Win32 ... отправная точка для поиска - та самая ф-ция, которую я тебе привел ... там фигурируют термины kernel-time и user-time .. от них и пляши ... пока не поймешь, что это и чем отличается, так и будешь долдонить про свои 100% - ни понимание сути и дело от этого не двинутся с места


Тимохов   (2004-07-01 16:43:00) [13]


> ПЛОВ   (01.07.04 16:16) [6]


> Интерестно вы ставите вопрос...

Ну так в среднем получится - средний процент загрузки данными процессом процессора за год. Чем не показатель? :)))
Согласен, не совсем то, что нужно :)


ПЛОВ   (2004-07-01 16:16:00) [14]


> в чем проблема: с помощью приведенной функции определяете
> сколько работал процесс, делите не общее время, умножаете
> на 100. Чем не процент.

Интерестно вы ставите вопрос...
А если все это время процесс не работал а висел в памяти а в последние 2 минуты ему приспичело > while true do


DeadMeat   (2004-07-01 15:28:00) [15]

Похоже не хватает у меня лексикона, чтобы сформулировать вопрос верно...
> [3] Тимохов ©   (01.07.04 15:16)
Напишите это в Delphi, запустите и откройте TaskMgr... В столбике ЦП на вашем процессе будет число в интервале 97-99... Вот именно это мне и надо узнать, только для конкретного процесса...
Надеюсь сейчас правильно объяснил...


Digitman   (2004-07-01 15:26:00) [16]


> DeadMeat ©   (01.07.04 15:13) [2]


> получить скока в процентах ест конкретный процесс процессорного
> времени


(user_time / (user_time + kernel_time)) * 100


Тимохов   (2004-07-01 15:16:00) [17]


> то он займет 100 процентов всего процессорного времени

кто вам это сказал.
что в вашем понимании есть процессорное время?

в чем проблема: с помощью приведенной функции определяете сколько работал процесс, делите не общее время, умножаете на 100. Чем не процент.


DeadMeat   (2004-07-01 15:13:00) [18]

Видимо я неверно сформулировал вопрос... Мне не надо получать время, которое процесс работал и т.п. Мне надо получить скока в процентах ест конкретный процесс процессорного времени..., т.е. к примеру если запустить процесс, в котором есть такая вот строчка while true do;, то он займет 100 процентов всего процессорного времени... Вот это мне и надо узнать для конкретного процесса...
Извиняюсь, если не верно объяснил суть...


Digitman   (2004-07-01 11:07:00) [19]


> ткните


эт запросто, эт не заржавеет

GetProcessTimes()

Get = получить
Process = процесс
Times = времена (показатели времени)

даже при знании аглицкого на пять баллов сообразить, по каким ключевым словам следует шарить в справке, чрезвычайно сложно


Наверх

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