Что нового

[Элементы GUI] Как создать цикл сворачивание и разворачивание окна интересующего приложения

Автор
A

alex_tm

Новичок
Сообщения
16
Репутация
0
К сожалению, у меня не получилось найти информацию по вашей подсказке "Загрузка процесса...". Если у Вас будет немного времени помочь ещё и с этим - было бы неплохо.
 
Автор
A

alex_tm

Новичок
Сообщения
16
Репутация
0
Для меня это пока сложновато. Тем более совместить оба скрипта. Я только одно приблизительно представляю - эту проверку нужно вставить вместо
Код:
Global $iMax = 75 * 1024 * 1024
из предыдущего скрипта.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)
Opt('TrayAutoPause', 0)

Global $sProcName = 'firefox.exe' ; Название процесса
Global $iIdleTime = 5 ; Время бездействия процесса, по истечении которого происходит сброс памяти, в минутах
Global $iMemMax = 100 ; Размер используемой процессом памяти, при котором происходит ее сброс, в мегабайтах
Global $iMemCritical = 400 ; Максимальный (критический) размер используемой процессом памяти, при котором происходит ее сброс в любом случае (независимо от времени простоя процесса), в мегабайтах

Global $ProcessID, $Size, $PID = 0, $Prev1 = 0, $Prev2 = 0, $Timer = 0

$iIdleTime *= 60 * 1000
$iMemMax *= 1024 * 1024
$iMemCritical *= 1024 * 1024

While 1
	Sleep(500)
	$ProcessID = ProcessExists($sProcName)
	If $ProcessID Then
		$Size = _GetProcessMemoryUsage($ProcessID)
		If ($Size > $iMemCritical) Or (($Size > $iMemMax) And (_GetProcessIdleTime($ProcessID) > $iIdleTime)) Then
			_WinAPI_EmptyWorkingSet($ProcessID)
			_Reset()
		EndIf
	Else
		_Reset()
	EndIf
WEnd

Func _GetProcessIdleTime($ProcessID)

	Local $Time1 = _WinAPI_GetProcessTimes($ProcessID)
	Local $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 ($ProcessID = $PID) Then
			If Round(($Time1 - $Prev1) / ($Time2 - $Prev2) * 100) > 1 Then
				$Timer = 0
			EndIf
		Else
			$Timer = 0
		EndIf
		$Prev1 = $Time1
		$Prev2 = $Time2
		$PID = $ProcessID
		If $Timer Then
			Return TimerDiff($Timer)
		Else
			$Timer = TimerInit()
			Return 0
		EndIf
	EndIf
	_Reset()
	Return 0
EndFunc   ;==>_GetProcessIdleTime

Func _GetProcessMemoryUsage($ProcessID)

	Local $Data = _WinAPI_GetProcessMemoryInfo($ProcessID)

	If Not @error Then
		Return $Data[9]
	EndIf
	_Reset()
	Return 0
EndFunc   ;==>_GetProcessMemoryUsage

Func _Reset()
	$Timer = 0
	$PID = 0
EndFunc   ;==>_Reset


Тебе остается только настроить первые 4 параметра (комментарии см. в скрипте):

Код:
Global $sProcName = 'firefox.exe'
Global $iIdleTime = 5
Global $iMemMax = 100
Global $iMemCritical = 400


Скрипт работает следующим образом. Каждые 0.5 сек проверяется состояние процесса $sProcName. Если размер используемой им памяти превышает $iMemCritical, то сразу же происходит сброс памяти. Если размер используемой процессом памяти меньше $iMemCritical, то сброс памяти происходит только при выполнении двух условий:

  • Размер используемой памяти больше $iMemMax ($iMemMax < $iMemCritical).
  • Время бездействия процесса превышает $iIdleTime.

Время бездействия процесса определяется как время, в течении которого нагрузка ЦП этим процессом не превышает 1% (можно поставить 0 или больше 1%, зависит от поведения самого процесса). Если при щелчке мышкой по активному окну происходит скачок на 2% и более, то можно оставить 1%. Если скачок будет только до 1%, то нужно изменить строчку (aka чувствительность)

Код:
If Round(($Time1 - $Prev1) / ($Time2 - $Prev2) * 100) > 1


на

Код:
If Round(($Time1 - $Prev1) / ($Time2 - $Prev2) * 100) > 0


Надеюсь логика понятна.
 
Верх