Что нового

[Автоматизация] Выделяемая память для работы скрипта

Rudor

Новичок
Сообщения
2
Репутация
1
Здравствуйте, подскажите новичку каким образом можно уменьшить объем расходуемой памяти скриптом(х86 8 mb, x64 12mb). Сам скрипт отслеживает системное время на ПК и после того как время больше положенного начинает считать время простоя с последующим выключением ПК после превышения определенного значения.
Собственно сам скрипт
Код:
#NoTrayIcon;
 ;----------------------------------------------------------------------
 #include <WinAPIEx.au3>;
 Const $PWR_SHUTDONW = 1     ;Выключение
 Const $PWR_FORCE = 4        ;Принудительное завершение процессов
 Const $PWR_POWER_OFF = 8    ;Выключение питания

 Const $txt = ' Идет подготовка к выключению компьютера...' & @CRLF & 'Для отмены переместите курсор мыши...';
 $MyIni = @ScriptDir & '\scrpoff.ini';

 ;/Задержка выключения в минутах, время после которого происходит включение счетчика простоя
 $MaxTimeout = Int(IniRead ($MyIni, 'shutdown', 'timeout', 10),1);задержка перед выключением после появления сообщения
 $Timetostartoff = String(IniRead ($MyIni, 'shutdown', 'Timetostartoff', '18:30'));Время после которого ПК должен выключаться
 $MaxIdelTime = Int(IniRead ($MyIni, 'shutdown', 'MaxIdelTime', 10),1); максимальное время простоя ПК в минутах

 ;----------------------------------------------------------------------
  ;----------------------------------------------------------------------

Sleep(100);
$start2 = @HOUR & ":" & @MIN
	While $start2 < $Timetostartoff; Проверяем системное время
		SystemTime();
	WEnd
$IdelTime = 0;
$Flag = False;
	While $Flag = False
		While ($IdelTime/(6e+4)) <= $MaxIdelTime; Проверяем время простоя ПК
			IdelTimeFunc()
		WEnd
		TimeCh()
		SplashOff(); убираем сообщение если пользователь отменил выключения
		$Flag = False; устанавливаем флаг в 0 для дальнейшего цикла
		$IdelTime = _WinAPI_GetIdleTime(); синхранизируем значение времени простоя
	Wend
Exit;
 ;----------------------------------------------------------------------
 ;[Выключение ПК]
Func ShutdownMachine()
	SplashOff();
    Sleep(300);
	Shutdown ($PWR_SHUTDONW + $PWR_FORCE + $PWR_POWER_OFF);
 EndFunc
  ;----------------------------------------------------------------------
 ;[Системное время]
Func SystemTime()
 $start2 = @HOUR & ":" & @MIN
  Sleep(600000);задержка 10 минут
EndFunc
 ;----------------------------------------------------------------------
 ;[Время простоя]
 Func IdelTimeFunc()
	 $IdelTime = _WinAPI_GetIdleTime();
	 Sleep(300000);задержка  5 минут
 EndFunc
 ;----------------------------------------------------------------------
 ;[Функция отображения сообщения и выключения пк через установленный период времени]
Func TimeCh()
     $StartTimer = TimerInit();
 Sleep(100);
 $Flag = True;
 $MPos2 = MouseGetPos();
		Sleep(100);
		SplashTextOn('', $txt, 500, 100, -1, -1, 1+32, 'Verdana', 10);
		Sleep(100);
		While 1
		;--------------------------------------------------------------
			$Diff = Int(TimerDiff($StartTimer)/(6e+4));
			If $Diff>=$MaxTimeout Then ShutdownMachine(); ExitLoop;
		;--------------------------------------------------------------
		;Отслеживаем координаты мыши
			$MPos1 = MouseGetPos();
			If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop;
			Sleep(200);
			$MPos2 = MouseGetPos();
			If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop
			Sleep(200)
		;--------------------------------------------------------------
	Wend

EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
autoit.gif
(подробнее), а обычный код соответственно в тег [code]
code.gif
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
spoiler.gif
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, ваш Глобальный модератор.
 
Автор
R

Rudor

Новичок
Сообщения
2
Репутация
1
Убрал подключение WinAPIEx.au3, две необходимые функции для работы перенес в код скрипта _WinAPI_GetTickCount и _WinAPI_GetIdleTime,
при работе скрипт стал расходовать 3-4 мб RAM.
Может у кого то есть еще какие нибудь предложения по оптимизации?
Код:
#NoTrayIcon;
 ;----------------------------------------------------------------------
 Const $txt = ' Идет подготовка к выключению компьютера...' & @CRLF & 'Для отмены переместите курсор мыши...';
 $MyIni = @ScriptDir & '\scrpoff.ini';

 ;/Задержка выключения в минутах, время после которого происходит включение счетчика простоя
 $MaxTimeout = Int(IniRead ($MyIni, 'shutdown', 'timeout', 10),1);задержка перед выключением после появления сообщения
 $Timetostartoff = String(IniRead ($MyIni, 'shutdown', 'Timetostartoff', '18:30'));Время после которого ПК должен выключаться
 $MaxIdelTime = Int(IniRead ($MyIni, 'shutdown', 'MaxIdelTime', 10),1); максимальное время простоя ПК в минутах

 ;----------------------------------------------------------------------

Sleep(100);
$start2 = @HOUR & ":" & @MIN
	While $start2 < $Timetostartoff; Проверяем системное время
		SystemTime();
	WEnd
$IdelTime = 0;
$Flag = False;
	While $Flag = False
		While ($IdelTime/(6e+4)) <= $MaxIdelTime; Проверяем время простоя ПК
			IdelTimeFunc()
		WEnd
		TimeCh()
		SplashOff(); убираем сообщение если пользователь отменил выключения
		$Flag = False; устанавливаем флаг в 0 для дальнейшего цикла
		$IdelTime = _WinAPI_GetIdleTime(); синхранизируем значение времени простоя
	Wend
Exit;
 ;----------------------------------------------------------------------
 ;[Выключение ПК]
Func ShutdownMachine()
	SplashOff();
    Sleep(300);
	Shutdown (13);
 EndFunc
  ;----------------------------------------------------------------------
 ;[Системное время]
Func SystemTime()
 $start2 = @HOUR & ":" & @MIN
  Sleep(600000);задержка 10 минут
EndFunc
 ;----------------------------------------------------------------------
 ;[Время простоя]
 Func IdelTimeFunc()
	 $IdelTime = _WinAPI_GetIdleTime();
	 Sleep(300000);задержка  5 минут
 EndFunc
 ;----------------------------------------------------------------------
 ;[Функция отображения сообщения и выключения пк через установленный период времени]
Func TimeCh()
     $StartTimer = TimerInit();
 Sleep(100);
 $Flag = True;
 Local $MPos2 = MouseGetPos();
		Sleep(100);
		SplashTextOn('', ' Идет подготовка к выключению компьютера...' & @CRLF & 'Для отмены переместите курсор мыши...', 500, 100, -1, -1, 1+32, 'Verdana', 10);
		Sleep(100);
		While 1
		;--------------------------------------------------------------
			$Diff = Int(TimerDiff($StartTimer)/(6e+4));
			If $Diff>=$MaxTimeout Then ShutdownMachine(); ExitLoop;
		;--------------------------------------------------------------
		;Отслеживаем координаты мыши
			$MPos1 = MouseGetPos();
			If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop;
			Sleep(200);
			$MPos2 = MouseGetPos();
			If BitXor($MPos1[0],$MPos2[0]) Or BitXor($MPos1[1],$MPos2[1]) Then ExitLoop
			Sleep(200)
		;--------------------------------------------------------------
	Wend

EndFunc
Func _WinAPI_GetTickCount()

	Local $Ret = DllCall('kernel32.dll', 'dword', 'GetTickCount')

    If @error Then
		Return SetError(1, 0, 0)
	EndIf
    Return $Ret[0]
EndFunc   ;==>_WinAPI_GetTickCount

Func _WinAPI_GetIdleTime()

	Local $tLASTINPUTINFO = DllStructCreate('uint;dword')

	DllStructSetData($tLASTINPUTINFO, 1, DllStructGetSize($tLASTINPUTINFO))

	Local $Ret = DllCall('user32.dll', 'int', 'GetLastInputInfo', 'ptr', DllStructGetPtr($tLASTINPUTINFO))

	If (@error) Or (Not $Ret[0]) Then
		Return SetError(1, 0, 0)
	EndIf
	Return _WinAPI_GetTickCount() - DllStructGetData($tLASTINPUTINFO, 2)
EndFunc   ;==>_WinAPI_GetIdleTime
 ;----------------------------------------------------------------------
 

agikon

Знающий
Сообщения
789
Репутация
17
у меня иногда скрипты постоянно обращаются к своим файлам, ну то есть сам скрипт постоянно считывает сам себя из винчестера. Я это проверяю через Filemon. Так вот вроде всё нормально а винчестер загружен и постоянно трещит. Это было связано с тем что в самом коде была ошибка, а именно функция "case" не могда увидеть элемент который она отслеживала, ну например "case $var" а $var вообще нигде не обьявлен, и вот изза этого появляется такой глюк. Так что на это тоже стоит обращать внимание, а то вроде скрипт работает, процессор не грузит, а винт грузит.
 
Верх