Что нового

Как остановить функцию экстренно, не дожидаясь её логического завершения цикла?

shakur

Осваивающий
Сообщения
76
Репутация
24
Re: Как остановить функцию, без остановки всего скрипта?

если я правельно понял вопрос :scratch: м.б
Код:
return
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Re: Как остановить функцию, без остановки всего скрипта?

ну например есть некая функция _1()
внутри этой функции есть код, допустим есть цикл который что-то там делает.
так вот надо остановить выполнение цикла этой функции, но сам скрипт не закрывать.
 

shakur

Осваивающий
Сообщения
76
Репутация
24
Re: Как остановить функцию, без остановки всего скрипта?

если тебе нужно прервать работу функции пишем
Код:
return <возвращаемое значение>

после чего пойдет возврат в точку где была вызвана оная ф-ция, если после return будет указано значение, то ф-ция вернет это значение!
Код:
;...
$a = _1()
;...
; a = 100
func _1()
 for $i = 1 to 1000
    if $i = 100 then return $i ;завершаем ф-цию и возвращаемся в точку вызова
 next
; далее код ф-ции НЕ ВЫПОЛНЯЕТСЯ 
endfunc

если тебе нужно прервать цикл пишем
Код:
exitloop <Количество завершаемых уровней >

Код:
;...
_1()
;...
func _1()
for $i = 1 to 1000
 for $j = 1 to 1000
    if $i = 10 and $j = 5 then exitloop 2 ;выход сразу из двух цыклов
 next
next
; после чего продолжается код ф-ции

endfunc



p.s. читай справку там все описано
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Как остановить функцию, без остановки всего скрипта?

agikon [?]
надо остановить выполнение цикла этой функции, но сам скрипт не закрывать.
Код:
Global 	$i = 0

AdlibRegister('_MyFunc', 500)

While 1
	If $i = 20 Then
		$i = 0
		AdlibUnRegister('_MyFunc')
		ConsoleWrite('Функция остановлена!!!)' & @CRLF)
	EndIf
	ConsoleWrite('Работает скрипт!' & @CRLF)
	Sleep(250)
WEnd

Func _MyFunc()
	$i = Random(10, 20, 1)
	ConsoleWrite('Работает функция! ( ' & $i & ' )' & @CRLF)
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Re: Как остановить функцию, без остановки всего скрипта?

у вас примеры как выйти с цикла функции лежит в кодe самой этой же функции.
а вот как остановить эту функцию 1() по горячим клавишам, например ctrl+s ?
 

shakur

Осваивающий
Сообщения
76
Репутация
24
Re: Как остановить функцию, без остановки всего скрипта?

а вот как остановить эту функцию 1() по горячим клавишам, например ctrl+s ?


Код:
Global  $i = 0

HotKeySet("^s", "stopfunc") ;ctrl+s  СМОТРИ СПРАВКУ
AdlibRegister('_MyFunc', 500)

While 1
    ConsoleWrite('Работает скрипт!' & @CRLF)
    Sleep(250)
WEnd

func stopfunc()
   AdlibUnRegister('_MyFunc')
        ConsoleWrite('Функция остановлена!!!)' & @CRLF)
endfunc

Func _MyFunc()
    $i = Random(10, 20, 1)
    ConsoleWrite('Работает функция! ( ' & $i & ' )' & @CRLF)
EndFunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Re: Как остановить функцию, без остановки всего скрипта?

ребята спасибо вот теперь кажись понял.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Как остановить функцию, без остановки всего скрипта?

agikon [?]
у вас примеры как выйти с цикла функции лежит в кодe самой этой же функции.
А вы указывали в предыдущем сообщение, что выход должен быть по горячим клавишам?
[?]
так вот надо остановить выполнение цикла этой функции, но сам скрипт не закрывать.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Re: Как остановить функцию, без остановки всего скрипта?

а как остановить функцию _1() с помощью другой функции _2(), если она (т.е. _1() ) была запущена не через AdlibRegister ?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Re: Как остановить функцию, без остановки всего скрипта?

Код:
global $i = 0
hotkeyset ("1", "_1")
hotkeyset ("2", "_2")

while 1
sleep(1000)
wend

func _1()
$j = 0
while 1
if $i <> 0 then Return
consolewrite($j & ";")
$j += 1
sleep(1000)
wend
endfunc

func _2()
$i = 1
endfunc
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
Re: Как остановить функцию, без остановки всего скрипта?

спасибо, но это чуток не то чт мне надо.
мне надо чтобы экстренно завершить выполнение всех действий функции.

смотрите напрмер в функции _1() есть sleep(10000) то пока этот слип не досчитает то дальше код считываться не будет. То есть смотрите у вас функция должна дойти до конца, а потом начаться новый цикл и только тогда идёт проверка на $i.

А мне надо чтобы все действия функции завершались так сказать экстренно. например sleep(10000) (т.е 10 секунд) отсчитал только до 3 секунд и в эту минуту нужно завершить функцию где лежит этот sleep(10000), и этот слип на 3-ей секунде завершил своё действие. То есть абсолютно вырубить функцию, чтобы её код выключился не дожидаясь своего логического завершения цикла.
такое возможно?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
тогда на форуме есть темы про перезапуск скрипта.
По хоткею запускаешь новую копию скрипта и выходишь из текущего
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
ясно.
жаль что экстренно вырубить не можно
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon,
Используйте вместо больших Sleep() TimerInit() - TimerDiff(). Пример:
Код:
Global $fReturn = True

HotKeySet('1', '_My_Func')
HotKeySet('2', '_Return_All_Func')
HotKeySet('{Esc}', '_Exit')
While 1
	Sleep(50)
WEnd

Func _My_Func()
	Local $j = 0, $i_Start = TimerInit()
	HotKeySet('1')
	ConsoleWrite($j & ' сек. работает функция' & @LF)
	While $fReturn
		If TimerDiff($i_Start) > 1000 Then
			$j += 1
			ConsoleWrite($j & ' сек. работает функция' & @LF)
			$i_Start = TimerInit()
		EndIf
		Sleep(50)
	WEnd
	ConsoleWrite('вышли из функции по HotKey' & @LF)
	$fReturn = True
	HotKeySet('1', '_My_Func')
EndFunc   ;==>_My_Func

Func _Return_All_Func()
	$fReturn = False
EndFunc   ;==>_Return_All_Func

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
madmasles
спасибо, это уже меняет картину.
 

Rustem

Новичок
Сообщения
1
Репутация
0
Если у скрипта есть иконка, то его можно приостановить, кликнув на иконке правой кнопкой (и выбрав Pause, если в самом скрипте выставлена соответствующая опция). А можно ли прикрутить действие этого пункта меню к кнопке в созданном окне?
Если да - то как?
Спасибо.
 
Верх