Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.033 c
14-1091006892
Vlad Oshin
2004-07-28 13:28
2004.08.15
Дроздов (в мире животных) выпускает муз.диск :)


14-1090820709
Izyum
2004-07-26 09:45
2004.08.15
Эмулятор терминала


14-1091216641
gn
2004-07-30 23:44
2004.08.15
Мораль


1-1091547036
Hyboid
2004-08-03 19:30
2004.08.15
Перехват клавиатуры


1-1091433514
Chereepovets
2004-08-02 11:58
2004.08.15
Про планеровщик





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский