Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Creat0R
Цитата:
По PID вроде не работает
да не, вроде работает если PID передавать не строкой, а числом
Цитата:
я пытаюсь написать утилитку менеджер процессов
в таком случае эффективней выполнять запрос не по отдельным процессам, а сразу по всему списку, вот вариант ProcessList, который кроме PID и Name выводит дополнительно инфу по загрузке CPU:
Код: Выделить весь код
$a = _ProcessList ('')
If IsArray ($a) Then
    For $i=0 To $a[0][0]
        ConsoleWrite (StringFormat('%4i', $a[$i][0]) & ' : ' & StringFormat('%02i', $a[$i][2]) & ' : ' & $a[$i][1] & @CRLF)
    Next
EndIf

Func _ProcessList ($name = '', $ticks = 1000)
    Local $arrWork[1][3] = [[0,0,0]], $arrMain[1][3] = [[0,'_Summary',0]]
    Local $i, $colItems, $objItem, $objWMIService = ObjGet("winmgmts:\\.\root\CIMV2"), $where = 'WHERE IDProcess>0'
    If $name <> '' Then $where &= ' AND Name=' & '"' & $name & '"'
    ; Считываем необходимые характеристики процессов - попытка №1
    $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
    For $objItem In $colItems
        $arrWork[0][0]+=1
        ReDim $arrWork[$arrWork[0][0]+1][3]
        $arrWork[$arrWork[0][0]][0]=$objItem.IDProcess
        $arrWork[$arrWork[0][0]][1]=$objItem.PercentProcessorTime
        $arrWork[$arrWork[0][0]][2]=$objItem.Timestamp_Sys100NS
    Next
    If $arrWork[0][0]=0 Then Return ''
    ; Накапливаем статистику...
    Sleep ($ticks)
    ; Считываем необходимые характеристики процессов - попытка №2
    $colItems = $objWMIService.ExecQuery ("SELECT IDProcess,PercentProcessorTime,Timestamp_Sys100NS FROM Win32_PerfRawData_PerfProc_Process " & $where, "WQL", 0x30)
    For $objItem In $colItems
        For $i=1 To $arrWork[0][0]
            If $arrWork[$i][0]=$objItem.IDProcess Then
                $arrMain[0][0]+=1
                ReDim $arrMain[$arrMain[0][0]+1][3]
                $arrMain[$arrMain[0][0]][0]=$objItem.IDProcess
                $arrMain[$arrMain[0][0]][1]=$objItem.Name
                $arrMain[$arrMain[0][0]][2]=Round(100*($arrWork[$i][1]-$objItem.PercentProcessorTime)/($arrWork[$i][2]-$objItem.Timestamp_Sys100NS))
                $arrMain[0][2]+=$arrMain[$arrMain[0][0]][2]
            EndIf
        Next
    Next
    If $arrMain[0][2]>100 Then $arrMain[0][2]=100
    Return $arrMain
EndFunc
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:06, 09-03-2007 | #263