![]() |
![]() |
![]() |
|
Как получить имя процесса, занимающего большую часть процессорного времени в Per | ☑ | ||
---|---|---|---|---|
0
Lex_Liven
23.10.12
✎
08:30
|
Всем день.
В системе Windows XP есть монитор ресурсов системы (Perfomance Monitor). У меня есть программа, позволяющая получить из него значение любого счетчика в реальном времени. Мне нужно, чтобы эта программа знала самый "тяжелый" по процессорному времени процесс. Как это можно сделать? Какой счетчик выбрать? |
|||
1
Птах
23.10.12
✎
08:45
|
Смотря за какой период "самый тяжелый". Можно выбрать по "Среднее для ЦП", а можно по всего затраченному процессорному времени.
|
|||
2
Lex_Liven
23.10.12
✎
08:50
|
(1) Тот, который через Ctrl+Alt+Del показан с самым большим процентом нагрузки.
|
|||
3
Lex_Liven
23.10.12
✎
08:54
|
(1) То есть "самый тяжелый" на данный момент. За последнюю секунду, если нужен именно период.
|
|||
4
Lex_Liven
23.10.12
✎
08:55
|
+(0) Та же программа может получать данные из WMI. Если есть вариант с его использованием - тоже можно рассмотреть.
|
|||
5
Fedot200
23.10.12
✎
08:56
|
(4) Да через WMI смотри.
|
|||
6
Fedot200
23.10.12
✎
08:58
|
(4) http://www.script-coding.com/WMI_Processes.html Тебе в помощь
|
|||
7
Lex_Liven
23.10.12
✎
08:58
|
(5) Отличный совет. Где именно там искать? И как?
Программа - Samurize, если это что-то скажет. |
|||
8
Fragster
гуру
23.10.12
✎
08:58
|
поставь procmon
|
|||
9
Fedot200
23.10.12
✎
09:00
|
(7) вот что он может показать http://msdn.microsoft.com/en-us/library/windows/desktop/aa394372(v=vs.85).aspx
|
|||
10
Fragster
гуру
23.10.12
✎
09:00
|
||||
11
Fedot200
23.10.12
✎
09:00
|
(7) А какая цель? Можно, например, смотреть прямо из 1С.
|
|||
12
Fedot200
23.10.12
✎
09:02
|
(10) А она точно все покажет что в (9)?
|
|||
13
Fragster
гуру
23.10.12
✎
09:03
|
(12) вроде да. только она еще журнал пишет, а вызов WMI - тольок для текущих процессов...
|
|||
14
Lex_Liven
23.10.12
✎
09:05
|
(8) Нет, мне это нужно именно в Samurize вывести.
(9) Сам класс и его свойства я вижу, но так я смогу получить только информацию по конкретному процессу. А мне нужно что-то вроде "SELECT FIRST 1 ProcessName ... ORDER BY ProcessorUsage DESC" (приблизительно). При этом сам текст запроса я написать не могу. |
|||
15
Fragster
гуру
23.10.12
✎
09:08
|
(14) блин, типа в виджет, чтоли? у меня 95% времени десктоп не видлен, но запущен process explorer (рядом с прокмоном висит), который выводит графики загрузки в трей. если навести на значек трея - то выведет имя самого жручего процесса для графика процессора, коммит чардж для графика памяити, скорость для сети и т.п.
|
|||
16
Lex_Liven
23.10.12
✎
09:11
|
(15) Блин, типа давайте по теме, что-ли? Как смотреть на виджет, это мои проблемы. Есть конкретный вопрос с конкретными условиями задачи, давайте по ним и работать. Procmon не умеет сохранять свой вывод в png для просмотра статуса сервера по html.
|
|||
17
Fragster
гуру
23.10.12
✎
09:12
|
(16) png, html...
|
|||
18
Fedot200
23.10.12
✎
09:14
|
(14)вот кусок кода на 1С который я делал, может чем поможет:
ИмяП="1cv8.exe"; pEnum=objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'"); Для Каждого Object Из pEnum Цикл Про=Object.Properties_; Для Каждого Свойство Из Про Цикл Если Свойство.Name="ProcessId" Тогда |
|||
19
Lex_Liven
23.10.12
✎
09:18
|
SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'
Возвращает список процессов, у которых имя совпадает с указанным. К сожалению, я не могу найти у Win32_Process свойства "% загрузки ЦП". Единственное более-менее близкое по смысу - это KernelModeTime, но оно, кажется, содержит полное время работы процесса (в процессорном времени) с момента его запуска. |
|||
20
Fedot200
23.10.12
✎
09:52
|
(19) Вот проще код:
ИмяП="1cv8.exe"; pEnum=objWMIService.ExecQuery("SELECT * FROM Win32_Process WHERE Name = '"+ИмяП+"'"); Для Каждого Object Из pEnum Цикл Если Число(Object.OtherOperationCount)<4500 Тогда //убиваем процесс Object.Terminate(); КонецЕсли; КонецЦикла; Этим я проверял нормально ли запустилась 8-ка, просто я заметил, что если OtherOperationCount < 4 500 то восьмерка висит на вводе пароля пользователя. Может тоже какое свойство поможет. |
|||
21
Fedot200
23.10.12
✎
10:09
|
+ (20) кажись вот так называется свойство "PercentProcessorTime "
|
|||
22
Lex_Liven
23.10.12
✎
10:17
|
(21) У Win32_Process такого свойства нет. Да и в других классах не могу найти.
|
|||
23
Fedot200
23.10.12
✎
10:37
|
(22) Ага, точно. Вот у этого есть Win32_PerfRawData_PerfProc_Process
Здесь надыбал http://forum.sources.ru/index.php?showtopic=279727 |
|||
24
Fedot200
23.10.12
✎
10:37
|
||||
25
Lex_Liven
23.10.12
✎
10:53
|
Интересно, win32_perfformatteddata_perfproc_process и Win32_PerfRawData_PerfProc_Process у меня пустые. Ни свойств, ни результатов запроса по ним...
|
|||
26
Fedot200
23.10.12
✎
10:57
|
(25) скрипт в (23) пробовал?
|
|||
27
Lex_Liven
23.10.12
✎
11:02
|
Пробовал. Ошибка 80041010. Без описания.
|
|||
28
Lex_Liven
23.10.12
✎
11:04
|
Попытался оформить в виде скрипта, чтобы Самурайз получал значение функции. Ошибка та же.
Function TopConsumerProcess(strComputer) If strComputer = "" Then strComputer = "." Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set ProcessSet = objWMIService.ExecQuery ("Select * from Win32_PerfRawData_PerfProc_Process",,48) MaxConsume = 0 TopProcessConsumer = "" For each Process in ProcessSet <Вот на это строке падает> If Process.PercentProcessorTime > MaxConsume Then TopProcessConsumer = Process.Caption MaxConsume = PercentProcessorTime End If Next TopConsumerProcess = TopProcessConsumer End Function |
|||
29
Lex_Liven
23.10.12
✎
11:07
|
Все, разобрался.
1. Нужно было запустить службу "Расширения драйверов WMI (Windows Management Instrumentation)". 2. Выполнить в комстроке "wmiadap /f" Пошел ответ от WMI... Буду теперь его разбирать. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |