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

Вниз

Память и Время   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.52 MB
Время: 0.074 c
3-1090378576
Dub
2004-07-21 06:56
2004.08.15
подключение модуля для SQL


8-1084093956
dimon_programmer
2004-05-09 13:12
2004.08.15
Как правильно менять увеличивать резкость изображения


1-1091558535
Zilog
2004-08-03 22:42
2004.08.15
Как по дате определить день недели?


1-1091440491
vasilii
2004-08-02 13:54
2004.08.15
для чего в windows сущ-ут объект ActiveScript?


9-1082655981
NikeOLD
2004-04-22 21:46
2004.08.15
Lock Unlock поверхностей DirectDraw