Что нового

_ScriptRestart() - Надёжный перезапуск скрипта

art279

Новичок
Сообщения
20
Репутация
3
при нажатии на кнопку ОК либо при истечении времени ожидания скрипт сам завершается, тут Exit никчему, а вот в скрипте Shutdown_close он прсутствует: http://autoit-script.ru/index.php/topic,2483.new.html#new
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
art279 сказал(а):
при нажатии на кнопку ОК либо при истечении времени ожидания скрипт сам завершается, тут Exit никчему, а вот в скрипте Shutdown_close он прсутствует: http://autoit-script.ru/index.php/topic,2483.new.html#new
Сам он не завершается, его завершает Autoit, если далее нет кода. Ваш пример просто перезапускает сам себя, будучи не выгруженным, из памяти. Тот же цикл с MsgBox аналогичен вашему примеру.
Код:
While 1
MsgBox(64, "Info", "TEST", 5)
;~ $dist=(@ScriptFullPath)
;~ Run($dist)
WEnd
 

art279

Новичок
Сообщения
20
Репутация
3
ну это само собой, я же просто пример привёл, вот в этом скрипте уберёте строчку Run ($dist) и после первого же прохода (по нажатии кнопки "ОТМЕНА") он завершится и не перезапустится:
http://autoit-script.ru/index.php?action=dlattach;topic=2483.0;attach=951

P.S. Этот кусок кода демонстрирует самый простой и самый верный способ перезапуска скриптом самого себя, уже не один раз испытан и проверен - не подвёл:

Код:
MsgBox(64, "Info", "TEST")
$dist=(@ScriptFullPath)
Run($dist)
Exit
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
art279 объясните, пожалуйста, какой тут смысл в Exit
Код:
;~~~         
Case $msg = $button3
           MsgBox(64, "info", "Вы отменили действие")
           Run($self)
           Exit
;~~~



Добавлено:
Сообщение автоматически объединено:

*click*
*click*
 

art279

Новичок
Сообщения
20
Репутация
3
Garrett сказал(а):
art279 объясните, пожалуйста, какой тут смысл в Exit
Код:
;~~~         
Case $msg = $button3
           MsgBox(64, "info", "Вы отменили действие")
           Run($self)
           Exit
;~~~

Так ведь когда пользователь нажал "ОТМЕНА" то окно должно закрытся иначе замучается юзер его закрывать, плюс скрипт не будет выгружаться из памяти, а в процессах будут появлятся его копии, сами проверьте..... ;)

P.S. На счёт предотвращения повторного запуска завтра пример приведу, там всего пара строчек, хотя скрипт и без этого память не засоряет....
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вот здесь все давно уже реализовано.
 

art279

Новичок
Сообщения
20
Репутация
3
Yashied сказал(а):
Вот здесь все давно уже реализовано.

Ваш способ реализации требует подключения UDF а мой нет. Добавьте вот это в начало скрипта и всё ОК:

Код:
if WinExists(@ScriptName) Then Exit
	AutoItWinSetTitle(@ScriptName)


P.S. Может быть я Вас и задеваю чем то (мол я так старался а он пару строчек кода выложил и всё), но нельзя же всё подряд критиковать, все способы по своему хороши и интересны, я лишь делюсь опытом, как и все присутствующие в этой ветке форума
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вы можете играться с этим так, как Вам будет угодно. Но если Вы прочитаете полностью эту и некоторые другие ветки нашего форума, то увидите, что все это уже давным давно обсуждалось и не один раз. Велосипед Вы явно не изобрели.

Вопрос на засыпку. Объедините этот Ваш пример с предыдущим. Будет работать (если будет, то всегда ли)? Т.е. будет работать перезапуск скрипта при наличии защиты от повторного запуска в Вашей реализации?
 

art279

Новичок
Сообщения
20
Репутация
3
Yashied сказал(а):
Объедините этот Ваш пример с предыдущим. Будет работать (если будет, то всегда ли)? Т.е. будет работать перезапуск скрипта при наличии защиты от повторного запуска в Вашей реализации?

Да всё работает! - Всегда (до бесконечности) :smile:

Код:
#include <GUIConstants.au3>

if WinExists(@ScriptName) then Exit
	AutoItWinSetTitle(@ScriptName)
Opt("TrayIconDebug", 1)
;Opt("TrayAutoPause", 0)
;Opt("TrayIconHide", 1)
GUICreate("Сообщение от Админа!", 575,100)
GUICtrlCreateGroup ("КОМПЬЮТЕР СЕГОДНЯ ВЫКЛЮЧАТЬ НЕЛЬЗЯ! ТОЛЬКО ПРИ НЕОБХОДИМОСТИ!", 10, 10, 555, 70)
$button1=GUICtrlCreateButton ("ВЫКЛЮЧИТЬ КОМПЬЮТЕР", 15, 35, 175, 40)
$button2=GUICtrlCreateButton ("ПЕРЕЗАГРУЗИТЬ КОМПЬЮТЕР", 200, 35, 175, 40)
$button3=GUICtrlCreateButton ("ОТМЕНА", 385, 35, 175, 40)

$title="Завершение работы Windows"
;$title="Выключить компьютер"

$dist=(@ScriptFullPath)

if @WDAY=5 And @HOUR<20 Then
	
Do
	WinWait($title)
	Send("{ESC}")
	MsgBox(262208, "Сообщение от Админа", "СЕГОДНЯ КОМПЬЮТЕР НЕ ОТКЛЮЧАЕМ!!!")

while 1
GUISetState()
$msg=GUIGetMsg()

     Select
		 
         Case $msg = $button1
	       MsgBox(64, "info", "Вы выбрали выключение")
           Shutdown(1)
		   Exit
		   
         Case $msg = $button2
	       MsgBox(64, "info", "Вы выбрали перезагрузку")
           Shutdown(2)   
           Exit
		   
         Case $msg = $button3
	       MsgBox(64, "info", "Вы отменили действие")
		   Run($dist)
           Exit
		   
	 EndSelect		 
	 
WEnd

Until 1

EndIf
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Код:
If WinExists(@ScriptName) Then Exit

AutoItWinSetTitle(@ScriptName)

MsgBox(64, "info", "Вы отменили действие")
Run(@ScriptFullPath)
Sleep(100)
Exit


Откомпилируйте этот код и запустите .exe файл. Работает? Почему я поставил Sleep(100)? Потому что на некоторых компьютерах скрипт может не успеть выйти до того, как запустится его вторая копия. Еще у пользователей могут быть зарегистрированы OnAutoItExitRegister() функции, что дополнительно оттягивает завершение скрипта. Т.е. проверку на повторный запуск нужно делать только тогда, когда 100% известно, что первый скрипт завершил свою работу. К слову, на моем ноутбуке Ваш скрипт тоже работает, а на Desktop'е - нет.

А еще, пользователь может запустить свою программу с параметрами в коммандной строке...

А еще такой же @ScriptName может быть и у другого процесса...
 

art279

Новичок
Сообщения
20
Репутация
3
ну я же говорю что мой вариант это одно из предложений и учитывать что там у пользователей прописано я немогу, на моём десктопе 6 летней давности скрипт запускается с успехом, также как и на IBM PC300 (остались на работе ещё и такие, 128 ОЗУ, 700 Mhz) ;D так что я непонимаю почему у Вас на десктопе не работает он :blink:

P.S. Это скрипт и при использовании данного метода пользователь должен хоть немного пошевелить мозгами когда пишет скрипты, иначе ему ничего не поможет, ни мой скрипт ни WinApiEx.au3
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Вернемся немного назад.

art279 сказал(а):
Как я понял все тут обсуждают методы надёжного перезапуска скрипта после завершения его работы?! Если да то вот мой вариант демонстрации перезапуска скрипта...

Так вот, Ваш метод ненадежный.
 

art279

Новичок
Сообщения
20
Репутация
3
Yashied сказал(а):
Вернемся немного назад.

art279 сказал(а):
Как я понял все тут обсуждают методы надёжного перезапуска скрипта после завершения его работы?! Если да то вот мой вариант демонстрации перезапуска скрипта...

Так вот, Ваш метод ненадежный.

А разве Ваш полностью надёжный? Или Вам приятно новичков в грязь ударять (при том что некоторые из них довольно неплохие идеи высказывают....)? :whistle:

В защиту моего метода могу сказать следующее: не плодит копий, всегда перезапускается в нужный момент, не требует подключения дополнительных UDF, используется мало строк кода, а самое главное работает и ещё ниразу не подводил!
Остальные скрипты (приведённые в данной ветке) я опробовал, и каждый из них по своему уникальный, но критиковать и посоветовать что-либо создателям я немогу (своя рубашка ближе к телу), каждый пользуется своими наработками.
Приведёте явный пример ненадёжности (именно на практике а не на словах), вот тогда я буду благодарен (за исправление моих ошибок), а пока я расцениваю критику в адрес моего метода как неконструктивную, Ваш метод я ведь не критикую, каждый пользуется своим, я всего лишь предложил, попрошу более если нет явных на то причин не критиковать а испытывать скрипт. :IL_AutoIt_1:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
art279 сказал(а):
А разве Ваш полностью надёжный?

99.(9)%

:smile:

art279 сказал(а):
Или Вам приятно новичков в грязь ударять (при том что некоторые из них довольно неплохие идеи высказывают....)?

У Вас не очень хорошее начало на этом форуме. Я никого "в грязь не ударяю". Если новичок просит что-то объяснить, то я всегда и в подробной форме готов написать все, что сам знаю (надеюсь многие здесь это подтвердят). И уж тем более никогда не отвергаю "неплохие" идеи. Скорее наоборот, стараюсь поддержать их и развить дальше.

Я специально вел с Вами эту бесполезную дискуссию (хотя мне уже было все понятно по вашему разговору с Garrett'ом) и дал Вам шанс привести хоть один обоснованный аргумент в пользу Ваших утверждений, но так ничего и не дождался, кроме как "всё работает" или "запускается с успехом". Если, как Вы говорите, Вы новичок, то для чего нужен вообще этот спор. Новички, как правило, не спорят (безаргументировано), а спрашивают. Вы даже не удосужились прочитать полностью эту ветку, где объясняются все возможные проблемы, связанные с перезапуском скрипта, а сразу стали предлагать Ваши "простые" способы, наивно полагая, что другие участники этой дискуссии до этого не додумались, хотя, это было где-то в начале.

Если бы это была не моя тема, то я бы возможно дождался финала этого "увлекательнейшего" разговора, а так, отдохните 1 день, подумайте что к чему...

:ninja2:
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
`p r o x y сказал(а):
По-моему, самый надежный и, тем более, самый-самый гибкий метод уже предложен.

Да, вот здесь. Ничего лишнего + не создается временных файлов.

:smile:
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Yashied
Так, а как обновление скрипта - т.е. удалить и заменить?
Ведь сам скрипт и запускается:
Код:
Run(@ScriptFullPath...
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Так, о каком примере идет речь?
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Я в саму UDF заглянул.
Так как вопрос темы стоял только о перезапуске, то безпорно, это вариант лучше.
Я имелл ввиду, когда необходимо перезаписать файл программы на новую версию.
В этом случае необходим сторонний файл, например bat. Ну а пример с temp
AutoIt файлом еще гибче.
 
Верх