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

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

Как получить % загрузки процесора конкретным приложением? [D5, NT4, Win2k, WinXP]


igornov ©   (2002-09-11 17:50:00) 

Hi All!

Требуется следить за активностью приложения и через заданное время если приложение простаивает, то завершить его. Я так понимаю мне нужно то о чём говорится в теме?
Имя процесса я могу получить, а также его ID. Как мне узнать
%? Или может есть какие-либо другие способы отслеживания активности приложения?

Заранее благодарен за помощь.

С ув. Игорь Новосёлов
ICQ : 46732777


igornov   (2002-09-19 10:24:00) [1]

Спасибо!
Всё получилось... но как и следовало ожидать возникли другие проблемы. Я написал программу которая делает выше описанное в виде сервиса, который запускается под сетевым логином входящим в
Domain Admins. Если на локальной машине загружается профиль с правами администратора данной машины то всё работает как часы.
Но если загружается профиль с правами обычного пользователя, то
сервис хоть он и запускается с правами админа, не видит процессов других пользователей...видит только себя. Пробовал
на локальной машине дать группе "пользователи" все какие есть права- никаких результатов. Я использую для просмотра процессов модуль PSAPI. Может у него есть какие-либо ограничения?


troits   (2002-09-18 17:55:00) [2]

С помощью API - ф-ции FileTimeToSystemTime получаем стр-ру TSystemTime, где время в "нормальном" виде.
Если надо еще как-то с ним поработать, складывать или вычитать, можно воспользоваться дельфийским типом TDateTime и SysUtils - овской SystemTimeToDateTime.


igornov   (2002-09-17 18:28:00) [3]

Я так и делал... Но как оказалось процесс хоть и нет в его главном окне никакого ввода всё равно за промежуток времени 10-15 минут хоть раз но дёргает процессор. Притом на 2000 и на NT4 это работает по-разному. На Nt дёргает а на 2000 всё нормально.
Эти подёргивания длятся несколько милисекунд. Так что если бы на милисекунды не обращать внимания то было бы всё ок. Но не могу
получить в нормальном виде в Delphi значение User Time + Kernel Time чтобы отбросить милисекунды. Как расшифровать эти значения?
...А WaitForInputIdle как я понял следит за отсутствием клавиатурного ввода в процесс, но мне этого мало - этот процесс
может работать длительное время в авторежиме(без клавиатуры) и тогда его снимать не надо, в только тогда когда он действительно ничего не делает.


troits   (2002-09-17 17:56:00) [4]

Я думал смотреть не просто User Time + Kernel Time, а как изменяется эта сумма за произвольный промежуток времени. То есть, если сумма не изменилась, то процесс простаивает (может быть, и вместе со всеми остальными) и его надо завершать.
Все зависит от того, что нужно. Если критерием для "убийства" процесса является просто его "простой", то IMHO лучше всего использовать WaitForInputIdle.


igornov   (2002-09-17 16:19:00) [5]

Да но если все процессы стоят то User Time + Kernel Time и них
не меняется и это значит что отношение User Time + Kernel Time требуемого процесса к User Time + Kernel Time всех процессов неизменно и равно какому-то значению (не 0). А на самом деле процесс стоит... Вот и думаю, что к User Time + Kernel Time всех
процессов нужно добавить Idle ("бездействие системы") тогда и получится реальная цифра... хотя может и ошибаюсь.


troits   (2002-09-17 15:53:00) [6]

А зачем нужно время бездействия? Ведь нас интересует относительная загрузка процессора.

Но может, в данном случае "бездействие" процесса попробовать детектировать с помощью WaitForInputIdle ?


igornov   (2002-09-17 15:37:00) [7]

Попробовал я User Time + Kernel Time за промежуток времени.
Идея неплохая... только для того чтобы подсчитать % нужно знать
также время бездействия системы. А как его определить не знаю...


troits   (2002-09-12 15:48:00) [8]

Мне кажется, можно попробовать GetProcessTimes.
То есть, например, получить User Time + Kernel Time для всех запущенных процессов за какой - то промежуток времени и сравнить с такой же суммой для нашего процесса.

Может, есть способ получше?


igornov   (2002-09-12 13:44:00) [9]

Что-то я не нашёл ключа HKEY_DYN_DATA в реестре w2k...


Asteroid   (2002-09-11 19:15:00) [10]

Можно посмотреть в реестре (HKEY_DYN_DATA, а дальше еще что-то), но там информация неправильная. Во всяком случае у меня в 98SE и в ME было так.


Наверх

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