Что нового

Рестарт скрипта

saloma

Новичок
Сообщения
19
Репутация
0
Добрый день. Имеется скрипт, с кучей циклов внутри.
Работа скрипта начинается с ввода значений в массив.
Можно ли сделать кнопку, что бы в любой момент выполнения скрипта, я мог ее нажать, и скрипт начинал работу заново, с ввода значений.
 

StarEdik

Новичок
Сообщения
365
Репутация
4
saloma
Здесь примеры для ваших нужд

Перезапуск скрипта
http://autoit-script.ru/index.php?topic=309.msg2812#msg2812

Надежный перезапуск скрипта
http://autoit-script.ru/index.php?topic=309.msg2144#msg2144
http://autoit-script.ru/index.php?topic=417.0
 
Автор
S

saloma

Новичок
Сообщения
19
Репутация
0
я создаю тему после того, как прочесал гугл. Все это я видел, и это нечем не поможет.Мб я не так выразился. Мне нужен скорее не рестарт, а откат к началу скрипта
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Начало скрипта, где ввод значений в массив вынести в функцию и привязать к этой функции HotKey. Таким образом Вы в любое время можете вернуться к вводу значений в массив.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
весьма примерно так
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $f
$Form1 = GUICreate("Form1", 456, 147, 192, 124)
Global $Progress1 = GUICtrlCreateProgress(24, 40, 406, 17)
Global $Button1 = GUICtrlCreateButton("старт", 32, 88, 75, 25)
Global $Button2 = GUICtrlCreateButton("рестарт", 344, 88, 75, 25)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_start()
	EndSwitch
WEnd

Func _start()
	For $i = 1 To 100
		GUICtrlSetData($Progress1, $i)
		Sleep(50)
		If $f Then
			$i = 0
			$f = 0
		EndIf
	Next
	GUICtrlSetData($Progress1, '')
EndFunc   ;==>_start

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	Switch $nNotifyCode
		Case 0
			Switch $nID
				Case $Button2
					$f = 1
			EndSwitch
	EndSwitch
	Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND

а вообще, нужно смотреть каждый случай конкретно
 

uritalex

Новичок
Сообщения
197
Репутация
3
Если смысл в перезапуске скрипта с заменой данных то самый простой вариант это сделать запускающий скрипт. Запускающий скрипт запускает основной, запоминает PID процесса запущенного скрипта и при получении команды просто завершает запущенный процесс с последующим перезапуском.
 
Автор
S

saloma

Новичок
Сообщения
19
Репутация
0
joiner сказал(а):
весьма примерно так
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Global $f
$Form1 = GUICreate("Form1", 456, 147, 192, 124)
Global $Progress1 = GUICtrlCreateProgress(24, 40, 406, 17)
Global $Button1 = GUICtrlCreateButton("старт", 32, 88, 75, 25)
Global $Button2 = GUICtrlCreateButton("рестарт", 344, 88, 75, 25)
GUISetState()
GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			_start()
	EndSwitch
WEnd

Func _start()
	For $i = 1 To 100
		GUICtrlSetData($Progress1, $i)
		Sleep(50)
		If $f Then
			$i = 0
			$f = 0
		EndIf
	Next
	GUICtrlSetData($Progress1, '')
EndFunc   ;==>_start

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	Switch $nNotifyCode
		Case 0
			Switch $nID
				Case $Button2
					$f = 1
			EndSwitch
	EndSwitch
	Return 'GUI_RUNDEFMSG'
EndFunc   ;==>WM_COMMAND

а вообще, нужно смотреть каждый случай конкретно
а куда тут свой код пихать?_)


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

uritalex сказал(а):
Если смысл в перезапуске скрипта с заменой данных то самый простой вариант это сделать запускающий скрипт. Запускающий скрипт запускает основной, запоминает PID процесса запущенного скрипта и при получении команды просто завершает запущенный процесс с последующим перезапуском.
это идеально подходит, а есть пример реализации?)


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

Попробовал извоять, но по какой то причине не работает
Код:
HotKeySet("{F2}", "Start")
HotKeySet("{F4}", "Stop")
HotKeySet("{F3}", "MyExit")
Global $pid
While 1
    Sleep(10)
WEnd
Func Start()
;  $pid = Run("notepad.exe", "", @SW_SHOWMAXIMIZED)
 ; $pid = Run("1.exe","@ScriptDir")
  $pid = Run(@ScriptDir & "1.exe")
 EndFunc
 Func Stop()
   ProcessClose($pid)
 EndFunc
Func MyExit()
    Exit
EndFunc
Блокнот запускает, а прогу нет. Лежит в той же директории, что и запускатор
 

uritalex

Новичок
Сообщения
197
Репутация
3
Может не так понял но вот что мне взбрело в голову :smile: (проверил работает по желанию можно уменьшить паузы):
Код:
HotKeySet("{F4}", "_Restart")
HotKeySet("{F5}", "_Stop")

While 1
   Global $sPID = Run("Скрипт.exe")
   Sleep (10000)
	  While 1
		 If ProcessExists($sPID) Then
			Sleep (5000) ; 5 сек
		 Else
			ExitLoop
		 EndIf
	  WEnd
   Sleep (5000)
WEnd

Func _Restart()
    ProcessClose($sPID)
EndFunc
Func _Stop()
    ProcessClose($sPID)
	Sleep (500)
	Exit
EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
A

Alofa

Гость
Я извиняюсь - вроде как тема решена, но все-таки хотел спросить у профи...
Скажите, а чем плох примерно такой вариант:
Код:
If $CmdLineRaw Then ProcessWaitClose($CmdLineRaw)
	
HotKeySet("{F4}", "_Restart")

; Здесь творим, что хотим...
;~ While 1
;~ 	Sleep(200)
;~ WEnd

Func _Restart()
;~ 	... Здесь необходимо предусмотреть закрытие ВОЗМОЖНО открытых библиотек, требующих этого, очистку ресурсов и т.п.
;~ 	... 
	Run(@ScriptFullPath & ' ' &@AutoItPID)
	Exit
EndFunc

И вроде как дополнительного запускающего скрипта делать не надо.
Правда такое сработает, только если скрипт не защищен от повторного запуска.
 

uritalex

Новичок
Сообщения
197
Репутация
3
По сути вариантов много :smile: возможно даже реализовать так:
Код:
HotKeySet("{F4}", "_Restart")
While 1 ;1-й цикл
; тут делаем выбор или ввод параметров
   While 1 ; 2-й цикл
      ;Тут выполняем обработку
      
   Wend
Wend
Func _Restart()
;~  ... Здесь делаем выход из второго While
EndFunc
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Интересно посмотреть, как вы это будете делать?
Можно создать переменную и в цикле условие выхода по значению этой переменной
Код:
HotKeySet("{F4}", "_Restart")
$ExitWhile=0
While 1 ;1-й цикл
; тут делаем выбор или ввод параметров
   While 1 ; 2-й цикл
      ;Тут выполняем обработку

      If $ExitWhile Then ;Здесь выход по условию
        $ExitWhile=0
        ExitLoop
      EndIf

   Wend
Wend
Func _Restart()
;~  ... Здесь делаем выход из второго While
$ExitWhile=1
EndFunc
 

uritalex

Новичок
Сообщения
197
Репутация
3
Я не профи и могу ошибаться но в одном из своих скриптов сделал так:
Код:
HotKeySet("{F4}", "_Restart")
$sRest = 0
While 1
    ; добавление данных
    While 1
     ; тут сам скрипт и по тексту скрипта проставил 
     If $sRest = 1 Then ExitLoop ; ExitLoop ставим нужного уровня если есть другие циклы 
     Wend
Wend


Func _Restart()
$sRest = 1
EndFunc

Для маленьких скриптов подходит нормально, но для больших сделать проще через запускающий как по мне

Опоздал :smile:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Код:
If $sRest = 1 Then ExitLoop
только нужно ещё вернуть переменной "$sRest" значение "0" до выхода из цикла, иначе при следующем входе в цикл скрипт сразу из него и выйдет.
 

uritalex

Новичок
Сообщения
197
Репутация
3
Чуток поспешил :smile: хотел так :
Код:
While 1
    ; добавление данных
    While 1
      $sRest = 0
     ; тут сам скрипт и по тексту скрипта проставил 
     If $sRest = 1 Then ExitLoop ; ExitLoop ставим нужного уровня если есть другие циклы 
     Wend
Wend

Т.к. нам нужно прервать цикл с выполнением обработки ранее введенных данных т.е. "второй" по счету вот в начало его и закинуть переменную
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Так у Вас никогда условие выхода из цикла не выполнится - вы присваиваете переменной "0" и условие выхода, если она "1"... Можно угадать, если нажать "HotKey" именно в этот промежуток, что не реально.
А вообще, если нужен именно рестарт скрипта, а не выход из цикла, то я пользуюсь замечательной UDF "Restart.au3" от автора Yashied !
 
Верх