Что нового

Использование AdlibRegister(..) в количестве 2 и более

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Есть несколько зарегестрированных Adlib-функций. Что будет если вызывается какая-нибудь из них.
В справке написано, что приостанавливается работа основного скрипта. А что будет с остальными Adlib-функциями? Они также будут проверять условия и в случае их истинности выполнять дальнейшее содиржимое и переключаться на выполнение других функций. Или же вызов одной Adlib-функции приотстанавливает запуск других.
Код:
AdlibRegister('_Func1', 250)
AdlibRegister('_Func2', 250)
AdlibRegister('_Func3', 250)

While 1
	; основной цикл программы
WEnd

Func _Func1()
	If $fBoolean_1 Then
		; Выполлнение определённых действий по условию
	EndIf
EndFunc

Func _Func2()
	If _DateDiff('n', $sStartDate, _NowCalc())>IniRead('Settings.ini', 'Timers', 'Action_1', '2012/04/11 14:20:41') Then
		; Выполлнение определённых действий по времени
	EndIf
EndFunc

Func _Func3() ; обработка окна ошибки IE
	If WinExists('[TITLE:Windows Internet Explorer; CLASS:#32770]') Then
	    WinActivate('[TITLE:Windows Internet Explorer; CLASS:#32770]')
    	Sleep(Random(2000, 3000, 1))
    	ControlClick('[TITLE:Windows Internet Explorer; CLASS:#32770]', '', '[CLASS:Button; INSTANCE:1]')
    EndIf
	If WinExists('[TITLE:Windows; CLASS:#32770]') Then
	    WinActivate('[TITLE:Windows; CLASS:#32770]')
    	Sleep(Random(2000, 3000, 1))
    	ControlClick('[TITLE:Windows; CLASS:#32770]', '', '[CLASS:Button; INSTANCE:1]')
    EndIf
EndFunc


На простеньком примере подразобрался малость Похоже, что Adlib-функции будут запускаться по очереди. Разное время Sleep(..) в теле каждой из функций наглядно подтверждает, что пока выполняется одна функция, то все остальные на это время блокируются.

Код:
Global $f1=False, $f2=False
Opt("TrayIconDebug", 1)
AdlibRegister('_Func1', 250)
AdlibRegister('_Func2', 250)
AdlibRegister('_Func3', 250)
HotKeySet('{1}', '_F1_true')
HotKeySet('{2}', '_F1_false')
HotKeySet('{3}', '_F2_true')
HotKeySet('{4}', '_F2_false')
HotKeySet('{esc}', '_Finish')

While 1
	Sleep(50)
	ToolTip('')
WEnd

Func _Func1()
	If $f1=True Then
		ToolTip('Func_1' & @CRLF & 'f1=' & $f1 & @CRLF & 'f2=' & $f2 , 0, 50)
		Sleep(2000)
		ToolTip('')
	EndIf
EndFunc

Func _Func2()
	If $f2=True Then
		ToolTip('Func_2' & @CRLF & 'f1=' & $f1 & @CRLF & 'f2=' & $f2 , 0, 50)
		Sleep(1000)
		ToolTip('')
	EndIf
EndFunc

Func _Func3()
	If $f1=False And $f2=False Then
		ToolTip('Func_3' & @CRLF & 'f1=False' & @CRLF & 'f2=False' , 0, 50)
		Sleep(500)
		ToolTip('')
	EndIf
EndFunc

Func _F1_true()
	$f1=True
EndFunc

Func _F1_false()
	$f1=False
EndFunc

Func _F2_true()
	$f2=True
EndFunc

Func _F2_false()
	$f2=False
EndFunc

Func _Finish()
	Exit
EndFunc
 

Medic84

Омега
Команда форума
Администратор
Сообщения
1,590
Репутация
341
ggzgamer
Если ты их выставил с одним временем, то они и будут выполняться по порядку - дожидаясь выполнения предыдущей.
 
Автор
G

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Поменял время вызова на 37ms, 99ms, 17ms - некратные чила. И всё равно, пока выполняется одна, то другая блокируется.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
ggzgamer
в противном случае, это была бы многопоточность ;)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Я подозревал что они могут прерывать друг друга, значит ошибался.

ggzgamer
А проверь ещё - после прерывания счётчик запускает функцию относительно виртуального времени или относительно начала предыдущего выполнения функции или от конца предыдущего выполнения функции.
 
Автор
G

ggzgamer

Осваивающий
Сообщения
134
Репутация
23
Не понял за какое виртуальное время идёт речь и как реализовать затею.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
Global $f1=False, $f2=False
Opt("TrayIconDebug", 1)
AdlibRegister('_Func1', 250)
AdlibRegister('_Func2', 250)
AdlibRegister('_Func3', 250)
HotKeySet('{1}', '_F1_true')
HotKeySet('{2}', '_F1_false')
HotKeySet('{3}', '_F2_true')
HotKeySet('{4}', '_F2_false')
HotKeySet('{esc}', '_Finish')

While 1
    Sleep(50)
    ToolTip('')
WEnd

Func _Func1()
    If $f1=True Then
        ConsoleWrite('Func_1 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
        Sleep(2000)
        ConsoleWrite('/Func_1 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
    EndIf
EndFunc

Func _Func2()
    If $f2=True Then
        ConsoleWrite('Func_2 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
        Sleep(1000)
        ConsoleWrite('/Func_2 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
    EndIf
EndFunc

Func _Func3()
    If $f1=False And $f2=False Then
        ConsoleWrite('Func_3 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
        Sleep(5000)
        ConsoleWrite('/Func_3 : f1=' & $f1 & ',f2=' & $f2 & 'time='& @MIN & ':' & @SEC & @CRLF)
    EndIf
EndFunc

Func _F1_true()
    $f1=True
EndFunc

Func _F1_false()
    $f1=False
EndFunc

Func _F2_true()
    $f2=True
EndFunc

Func _F2_false()
    $f2=False
EndFunc

Func _Finish()
    Exit
EndFunc

Код:
Func_3 : f1=False,f2=Falsetime=12:14
/Func_3 : f1=False,f2=Falsetime=12:19
Func_3 : f1=False,f2=Falsetime=12:19
/Func_3 : f1=False,f2=Falsetime=12:24
Func_3 : f1=False,f2=Falsetime=12:24
/Func_3 : f1=True,f2=Falsetime=12:29
Func_1 : f1=True,f2=Falsetime=12:29
/Func_1 : f1=True,f2=Falsetime=12:31
Func_1 : f1=True,f2=Falsetime=12:31
/Func_1 : f1=True,f2=Falsetime=12:33
Func_1 : f1=True,f2=Falsetime=12:33
/Func_1 : f1=True,f2=Falsetime=12:35
Func_1 : f1=True,f2=Falsetime=12:35
/Func_1 : f1=False,f2=Falsetime=12:37
Func_3 : f1=False,f2=Falsetime=12:37
/Func_3 : f1=False,f2=Falsetime=12:42
Func_3 : f1=False,f2=Falsetime=12:42

imho привязка к общему времени.
 
Верх