Что нового

Выполнение функции с заданным интервалом.

Can

Новичок
Сообщения
59
Репутация
1
Здравствуйте! Подскажите пожалуйста на примере, как сделать, чтобы функция Func4() выполнялась с заданным интервалом(15 мин), приостанавливая работу основного цикла, а после её выполнения, скрипт продолжил работу точно с того же места, где прервался?

Вот пример:

Код:
HotKeySet ( "{ESC}" ,"_Exit")

Global $nF = 1

While 1
   Switch $nF
   
 Case 1 
	 Cycle1()  
 Case 2
	 Cycle2()  
 Case 3 
	 Cycle3() 
   EndSwitch 
   Sleep(270)
WEnd


Func _Exit()
    Exit
EndFunc






Func Cycle1()
    ConsoleWrite("Cycle1()" & @CRLF)
	MouseMove(300, 27, 3)	
	Sleep(500)
    
$nF = 2

EndFunc


Func Cycle2()
    ConsoleWrite("Cycle2()" & @CRLF)
    MouseMove(300, 147, 3)
	Sleep(500)
        
	$nF = 3	
		
		
EndFunc


Func Cycle3()
    ConsoleWrite("Cycle3()" & @CRLF)
    MouseMove(485, 310, 3)   
	Sleep(300)
	
	$nF = 1

EndFunc



Func Func4()
    ConsoleWrite("Func4()" & @CRLF) ; 
     
	 PixelSearch( 100, 441, 880, 463, 0x3C251B, 0, 1) ;
		If Not @error Then
	$nF = 2 ; здесь работа скрипта продолжается в обычном режиме
	Else
	 
	 MouseMove(620, 546, 1) ;
	$nF =  ; надо вернуться в ту часть скпипта, где была прервана его работа для выполнения этой функции
EndFunc
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
Mr. Anderson сказал(а):
А Sleep(15000) не подходит в конце функции?


Функция4 должна срабатывать (каждые 15 мин) независимо от того, где выполняется скрипт, в примере я написал.
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
AdlibRegister("Func4", 15 * 60 * 1000)


Описание функции

AdlibRegister
Регистрирует Adlib-функцию.

AdlibRegister ( "function" [, time] )



Параметры

function Имя Adlib-функции для регистрации.
time [опционально] как часто будет вызываться зарегистрированная функция. По умолчанию функция вызывается каждые 250 мс.



Замечания

Каждые 250 мс (или time мс) вызывается указанная "function" (функция) - обычно для проверки возникновения неожиданных ошибок. Adlib-функция должна оставаться предельно простой, поскольку вызывается часто (а работа основного скрипта пристанавливается). Также, параметр time должен быть выбран внимательно, что бы избежать высокой загрузки ЦП.

Может быть зарегистрировано несколько Adlib-функций одновременно. Повторная регистрация зарегистрированной Adlib-функции означает, что функция будет зарегистрирована снова с новым параметром time.


См. также

AdlibUnRegister


Пример

AdlibRegister("MyAdlib")
;...
Exit

Func MyAdlib()
;... выполнение этой функции не должно быть заблокировано, избегайте использования...Wait(), MsgBox(), InputBox()
If WinActive("Error") Then
;...
EndIf
EndFunc
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
SyDr сказал(а):
Код:
AdlibRegister("Func4", 15 * 60 * 1000)


Подскажите пожалуйста на моём примере, как правильно сделать, а то у меня не работает никак:

Код:
HotKeySet ( "{ESC}" ,"_Exit")

AdlibRegister("Func4", 6000)


Global $nF = 1


While 1
   Switch $nF
   
 Case 1 
	 Cycle1()  
 Case 2
	 Cycle2()  
 Case 3 
	 Cycle3() 
   
 EndSwitch 
   Sleep(270)
WEnd


Func _Exit()
    Exit
EndFunc






Func Cycle1()
    ConsoleWrite("Cycle1()" & @CRLF)
	MouseMove(300, 27, 3)	
	Sleep(500)
    
$nF = 2

EndFunc


Func Cycle2()
    ConsoleWrite("Cycle2()" & @CRLF)
    MouseMove(300, 147, 3)
	Sleep(500)
        
	$nF = 3	
		
		
EndFunc


Func Cycle3()
    ConsoleWrite("Cycle3()" & @CRLF)
    MouseMove(485, 310, 3)   
	Sleep(300)
	
	$nF = 1

EndFunc



Func Func4()
    ConsoleWrite("Func4()" & @CRLF) ;
     MouseMove(385, 710, 3)   
	 
      ToolTip('     << PAUSE >>  ', 0, 0, '........', 1, 5)
       Sleep(3000)
	  ToolTip('', 0, 0)
      
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Can
У меня работает. А что у Вас не работает?
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
madmasles сказал(а):
Can
У меня работает. А что у Вас не работает?

При проверке Ctrl + F5 перед компилированием выдает ошибку :
(3,28) : ERROR: AdlibRegister(): undefined function.
AdlibRegister("Func4", 6000)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Can [?]
При проверке Ctrl + F5 перед компилированием выдает ошибку :
(3,28) : ERROR: AdlibRegister(): undefined function.
AdlibRegister("Func4", 6000)
А у Вас какая версия AutoIt?
 
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
madmasles сказал(а):
Can [?]
При проверке Ctrl + F5 перед компилированием выдает ошибку :
(3,28) : ERROR: AdlibRegister(): undefined function.
AdlibRegister("Func4", 6000)
А у Вас какая версия AutoIt?

3.3.0.0 , я вот тоже подумываю, что может устаревшая уже), это справка 3.2.5.4 рус, вроде так
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Автор
C

Can

Новичок
Сообщения
59
Репутация
1
madmasles сказал(а):
Can [?]
3.3.0.0 , я вот тоже подумываю, что может устаревшая уже)
У Вас много чего работать не будет.
Почитайте про изменения здесь: Объявления и новости. Там CreatoR подробно расписал изменения в каждой новой версии AutoIt.


Спасибо, обновил до 3.3.6.1 , все вроде заработало, но не так как надо!

При работе основного цикла, каждые 15 секунд должна включаться Func4 ,потом выполняться(причем не важно, сколько на это уйдёт времени), а потом должен опять выполняться основной цикл 15 сек,с того места, где был приостановлен и т.д.

В моём примере так не работает, а включает Func4() гораздо чаще


Пример:

Код:
HotKeySet ( "{ESC}" ,"_Exit")

AdlibRegister("Func4", 15000)


Global $nF = 1


While 1
   Switch $nF

 Case 1
     Cycle1()
 Case 2
     Cycle2()
 Case 3
     Cycle3()

 EndSwitch
   Sleep(270)
WEnd


Func _Exit()
    Exit
EndFunc






Func Cycle1()
    ConsoleWrite("Cycle1()" & @CRLF)
    MouseMove(300, 27, 1)
    Sleep(500)

$nF = 2

EndFunc


Func Cycle2()
    ConsoleWrite("Cycle2()" & @CRLF)
    MouseMove(300, 147, 1)
    Sleep(500)

    $nF = 3


EndFunc


Func Cycle3()
    ConsoleWrite("Cycle3()" & @CRLF)
    MouseMove(485, 310, 1)
    Sleep(300)

    $nF = 1

EndFunc



Func Func4()
    ConsoleWrite("Func4()" & @CRLF) ;
     MouseMove(385, 710, 3)

      ToolTip('     << PAUSE >>  ', 0, 0, '........', 1, 5)
       Sleep(3000)
      ToolTip('', 0, 0)

EndFunc


Подскажите пожалуйста, что не так?



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

Всем большое спасибо и +1, вроде на первый взгляд работает как надо, выяснится в последующем тестировании!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Can
Наиболее точный вызов функции с заданным интервалом у меня получился так:
Код:
Global $nF = 1, $iStart, $aH, $iK = 200, $iInterval = 10000

$iInterval = $iInterval - $iK

HotKeySet("{ESC}", "_Exit")

$aH = _CallBack_Init('Func4', $iInterval)
$iStart = TimerInit()
While 1
	ToolTip(StringFormat('%.2f', TimerDiff($iStart) / 1000) & ' sec', 0, 0)
	Switch $nF
		Case 1
			Cycle1()
		Case 2
			Cycle2()
		Case 3
			Cycle3()
	EndSwitch
	Sleep(Random(100, 300, 1))
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func Cycle1()
	ConsoleWrite("Cycle1()" & @CRLF)
	MouseMove(300, 27, 3)
	Sleep(Random(100, 1000, 1))
	$nF = 2
EndFunc   ;==>Cycle1

Func Cycle2()
	ConsoleWrite("Cycle2()" & @CRLF)
	MouseMove(300, 147, 3)
	Sleep(Random(100, 1000, 1))
	$nF = 3
EndFunc   ;==>Cycle2

Func Cycle3()
	ConsoleWrite("Cycle3()" & @CRLF)
	MouseMove(485, 310, 3)
	Sleep(Random(100, 500, 1))
	$nF = 1
EndFunc   ;==>Cycle3

Func Func4()
	_CallBack_Free($aH)
	ConsoleWrite("Func4()" & @CRLF) ;
	MouseMove(385, 710, 3)
	TrayTip('     << PAUSE >>  ', StringFormat('%.2f', TimerDiff($iStart) / 1000) & ' sec', 3, 1)
	Sleep(Random(2000, 8000, 1))
	TrayTip('     << PAUSE >>  ', 'End pause', 3)
	$aH = _CallBack_Init('Func4', $iInterval)
	$iStart = TimerInit()
EndFunc   ;==>Func4

Func _CallBack_Init($sFuncName, $iTime, $sParam = '')
	Local $hCallBack = DllCallbackRegister($sFuncName, 'int', $sParam)
	Local $aTimer = DllCall('user32.dll', 'uint', 'SetTimer', _
			'hwnd', 0, 'uint', 0, 'int', $iTime, 'ptr', DllCallbackGetPtr($hCallBack))
	Local $ahCallBack[2] = [$hCallBack, $aTimer[0]]
	Return $ahCallBack
EndFunc   ;==>_CallBack_Init

Func _CallBack_Free($ahCallBack)
	If $ahCallBack[0] <> -1 Then DllCallbackFree($ahCallBack[0])
	If $ahCallBack[1] <> -1 Then DllCall('user32.dll', 'int', 'KillTimer', 'hwnd', 0, 'uint', $ahCallBack[1])
EndFunc   ;==>_CallBack_Free

Величину $iK подберите для себя сами. У меня самая оптимальная 200.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
SyDr [?]
В моём примере так не работает, а включает Func4() гораздо чаще
Время задаётся в миллисекундах. 15 000 - это 15 секунд.
Я пробовал с AdlibRegister("Func4", 15000). У меня тоже Func4() отрабатывает чаще. Имхо, это из-за паузы в этой функции, т.е. AdlibRegister() отсчитывает время, естественно, не учитывая паузу в функции, из-за этого и вызов идет чаще. Пробовал в начале Func4() добавлять AdlibUnRegister("Func4"), а в конце AdlibRegister("Func4", 15000) - не помогает.
 

SyDr

Сидра
Сообщения
651
Репутация
158
А справку кто читать будет?
AdlibRegister("MyAdlib")
;...
Exit

Func MyAdlib()
;... выполнение этой функции не должно быть заблокировано, избегайте использования...Wait(), MsgBox(), InputBox()
If WinActive("Error") Then
;...
EndIf
EndFunc

Можно так сделать:
Код:
AdlibRegister("MyAdlib")
;...
Exit

Func MyAdlib()
	AdlibUnRegister("MyAdlib")
    ;... [b]выполнение этой функции не должно быть заблокировано[/b], избегайте использования...Wait(), MsgBox(), InputBox()
    If WinActive("Error") Then
        ;...
    EndIf
	AdlibRegister("MyAdlib")
EndFunc
 
Верх