Что нового

[Процессы] Определение момента окончания загрузки приложения

AekMob

Новичок
Сообщения
12
Репутация
1
Всем заглянувшим, привет!
Предыстория: При запуске приложения, в первые секунды своего существования оное (читай: многие из приложений) приложение потребляет ресурсы процессора, обращается к диску, а затем переходит в режим ожидания действий со стороны пользователя, в котором почти не занимает ресурсов системы.
Проблема: Требуется отловить момент перехода приложения в ждущий режим.
Ещё: Видимого окна, по которому можно было бы определить готово ли приложение к приёму данных не имеется (я о WinWaitActive - первый и единственный найденный мной способ решения данной проблемы. Кривой, так ещё и не во всех ситуациях помогает.).
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Я так понимаю под ресурсами понимается оперативная память?
Вот так можно посмотреть за статистикой использования памяти процессом:
Код:
HotKeySet('{Esc}', '_exit')
$hPid = Run('notepad.exe') ; или $hPid = WinGetProcess('Искомый заголовок')

While 1
	If Not ProcessExists($hPid) Then Exit
	$aProcessInfo = ProcessGetStats($hPid)
	ConsoleWrite($aProcessInfo[0]/1024 & ' Kb' & @CRLF)
	Sleep(1000)
WEnd

Func _exit()
	Exit
EndFunc

Ну а дальше, что-то вроде этого:
Код:
HotKeySet('{Esc}', '_exit')
$hPid = Run('notepad.exe') ; или $hPid = WinGetProcess('Искомый заголовок')
$iMemoryUseMax = 0
$iMemoryUseMin = 0

While 1
	If Not ProcessExists($hPid) Then
		MsgBox(0, 'Error', 'Целевой процесс не обнаружен!')
		Exit
	EndIf
	$aProcessInfo = ProcessGetStats($hPid)
	ConsoleWrite($aProcessInfo[0]/1024 & ' Kb' & @CRLF)
	If $aProcessInfo[0] > $iMemoryUseMax Then ; размер используемой памяти растет
		$iMemoryUseMax = $aProcessInfo[0]
	Else ; есть спад в размере используемой памяти
		$iMemoryUseMin = $aProcessInfo[0]
	EndIf
	If $iMemoryUseMin <> 0 And $iMemoryUseMin * 10 < $iMemoryUseMax Then
		MsgBox(0, 'Load down', 'Размер используемой памяти снизился более чем в 10 раз!')
		Exit
	EndIf
	Sleep(1000)
WEnd

Func _exit()
	Exit
EndFunc
 
Автор
A

AekMob

Новичок
Сообщения
12
Репутация
1
Я так понимаю под ресурсами понимается оперативная память?
Не совсем так. Задача определить, когда процесс не загружает процессор (или загружает минимально) и не обращается к диску.

Всё равно, спасибо за ответ, это уже кое что
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
AekMob
Задача определить, когда процесс не загружает процессор (или загружает минимально)
http://autoit-script.ru/index.php?topic=2715.0

Вот немного переделанный пример от Yashied:

Код:
#Include <WinAPIEx.au3>

Global Const $sProcess = 'notepad.exe' ; имя процесса
Global $PID = 0, $Prev1 = 0, $Prev2 = 0,  $nomer = 0, $CPU=0
 
While 1
$nomer +=1
If _Update() < 10 And $nomer <> 1 Then ; предел загрузки
ExitLoop
EndIf	
sleep (500)
WEnd


MsgBox(0, "Заголовок", "Загрузка процессора процессом " & $sProcess &" меньше 10%") 


Func _Update()
    Local $ID, $Time1, $Time2
    $ID = ProcessExists($sProcess)
    If $ID Then
        $Time1 = _WinAPI_GetProcessTimes($ID)
        $Time2 = _WinAPI_GetSystemTimes()
        If (IsArray($Time1)) And (IsArray($Time2)) Then
            $Time1 = $Time1[1] + $Time1[2]
            $Time2 = $Time2[1] + $Time2[2]
            If ($Prev1) And ($Prev2) And ($PID = $ID) Then
	$CPU=Round(($Time1 - $Prev1) / ($Time2 - $Prev2) * 100)
            EndIf
            $Prev1 = $Time1
            $Prev2 = $Time2
            $PID = $ID
	Return $CPU	  
        EndIf
    EndIf
    $Prev1 = 0
    $Prev2 = 0
    $PID = 0
EndFunc
 
Верх