Форум: "WinAPI";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
ВнизКак получить % загрузки процесора конкретным приложением? Найти похожие ветки
← →
igornov (2002-09-11 17:50) [0]Hi All!
Требуется следить за активностью приложения и через заданное время если приложение простаивает, то завершить его. Я так понимаю мне нужно то о чём говорится в теме?
Имя процесса я могу получить, а также его ID. Как мне узнать
%? Или может есть какие-либо другие способы отслеживания активности приложения?
Заранее благодарен за помощь.
С ув. Игорь Новосёлов
ICQ : 46732777
← →
Asteroid (2002-09-11 19:15) [1]Можно посмотреть в реестре (HKEY_DYN_DATA, а дальше еще что-то), но там информация неправильная. Во всяком случае у меня в 98SE и в ME было так.
← →
igornov (2002-09-12 13:44) [2]Что-то я не нашёл ключа HKEY_DYN_DATA в реестре w2k...
← →
troits (2002-09-12 15:48) [3]Мне кажется, можно попробовать GetProcessTimes.
То есть, например, получить User Time + Kernel Time для всех запущенных процессов за какой - то промежуток времени и сравнить с такой же суммой для нашего процесса.
Может, есть способ получше?
← →
igornov (2002-09-17 15:37) [4]Попробовал я User Time + Kernel Time за промежуток времени.
Идея неплохая... только для того чтобы подсчитать % нужно знать
также время бездействия системы. А как его определить не знаю...
← →
troits (2002-09-17 15:53) [5]А зачем нужно время бездействия? Ведь нас интересует относительная загрузка процессора.
Но может, в данном случае "бездействие" процесса попробовать детектировать с помощью WaitForInputIdle ?
← →
igornov (2002-09-17 16:19) [6]Да но если все процессы стоят то User Time + Kernel Time и них
не меняется и это значит что отношение User Time + Kernel Time требуемого процесса к User Time + Kernel Time всех процессов неизменно и равно какому-то значению (не 0). А на самом деле процесс стоит... Вот и думаю, что к User Time + Kernel Time всех
процессов нужно добавить Idle ("бездействие системы") тогда и получится реальная цифра... хотя может и ошибаюсь.
← →
troits (2002-09-17 17:56) [7]Я думал смотреть не просто User Time + Kernel Time, а как изменяется эта сумма за произвольный промежуток времени. То есть, если сумма не изменилась, то процесс простаивает (может быть, и вместе со всеми остальными) и его надо завершать.
Все зависит от того, что нужно. Если критерием для "убийства" процесса является просто его "простой", то IMHO лучше всего использовать WaitForInputIdle.
← →
igornov (2002-09-17 18:28) [8]Я так и делал... Но как оказалось процесс хоть и нет в его главном окне никакого ввода всё равно за промежуток времени 10-15 минут хоть раз но дёргает процессор. Притом на 2000 и на NT4 это работает по-разному. На Nt дёргает а на 2000 всё нормально.
Эти подёргивания длятся несколько милисекунд. Так что если бы на милисекунды не обращать внимания то было бы всё ок. Но не могу
получить в нормальном виде в Delphi значение User Time + Kernel Time чтобы отбросить милисекунды. Как расшифровать эти значения?
...А WaitForInputIdle как я понял следит за отсутствием клавиатурного ввода в процесс, но мне этого мало - этот процесс
может работать длительное время в авторежиме(без клавиатуры) и тогда его снимать не надо, в только тогда когда он действительно ничего не делает.
← →
troits (2002-09-18 17:55) [9]С помощью API - ф-ции FileTimeToSystemTime получаем стр-ру TSystemTime, где время в "нормальном" виде.
Если надо еще как-то с ним поработать, складывать или вычитать, можно воспользоваться дельфийским типом TDateTime и SysUtils - овской SystemTimeToDateTime.
← →
igornov (2002-09-19 10:24) [10]Спасибо!
Всё получилось... но как и следовало ожидать возникли другие проблемы. Я написал программу которая делает выше описанное в виде сервиса, который запускается под сетевым логином входящим в
Domain Admins. Если на локальной машине загружается профиль с правами администратора данной машины то всё работает как часы.
Но если загружается профиль с правами обычного пользователя, то
сервис хоть он и запускается с правами админа, не видит процессов других пользователей...видит только себя. Пробовал
на локальной машине дать группе "пользователи" все какие есть права- никаких результатов. Я использую для просмотра процессов модуль PSAPI. Может у него есть какие-либо ограничения?
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.10.31;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.015 c