Что нового

[Автоматизация] работа нескольких таймеров

kopeheb

Новичок
Сообщения
17
Репутация
0
Задался вопросом, можно ли добиться срабатывание нескольких таймеров.
пример взял из завалявшегося скриптика clickermann
Код:
;--- Код: Clickermann ---// Эти строки выполняются при запуске 1 раз
$time1 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time1", "TIME")))
$time2 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time2", "TIME")))
$time3 = INT(STRCONCAT ("0", INIREAD ("time.ini", "Time3", "TIME")))

          go:
IF($time1 < $_time_t)
   $time1 = $_time_t + 30 ; // выполняется каждые 30 сек
INIWRITE ("time.ini", "Time1", $time1, "TIME"); // запись в файл time.ini времени следующего срабатывания условия
   END_IF
IF($time2 < $_time_t)
   $time2 = $_time_t + 60 ; //...60 сек
INIWRITE ("time.ini", "Time2", $time2, "TIME"); // Здесь пишутся необходимые действия
   END_IF
IF($time3 < $_time_t)
   $time3 = $_time_t + 120 ; //...2 минуты
INIWRITE ("time.ini", "Time3", $time3, "TIME"); // Здесь пишутся необходимые действия
   END_IF
   WAITMS (500)
goto(go)  ; // переход к метке GO
и уже который день бьюсь, не пойму как реализовать:
Код:
#include <Date.au3>
HotKeySet('{Esc}','_quit')
Global $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
Global $Sec, $Min, $Hour, $Time
Global $time1, $time2, $time3
Func _quit()
   Exit
EndFunc

Func _WrTimer()
   $file = FileOpen('times.txt',2)
If $time1 < $_time_t Then
   $time1 = $_time_t + 3000
   FileWriteLine($file, $time1 & @CRLF)
EndIf

If $time2 < $_time_t Then
   $time2 = $_time_t + 6000
   FileWriteLine($file, $time2 & @CRLF)
EndIf

If $time3 < $_time_t Then
   $time3 = $_time_t + 1000
   FileWriteLine($file, $time3)
   FileClose($file)
EndIf
EndFunc

Func _ReadTimer()
$file = FileOpen('times.txt',0)
$time1 = FileReadLine($file,1)
$time2 = FileReadLine($file,2)
$time3 = FileReadLine($file,3)
         FileClose($file)
EndFunc

_WrTimer()

While 1
   $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
;_ReadTimer()
;$_time_t = $time1
;If Not @error Then
;   Beep(500,500)
   MsgBox(0,$_time_t,$time1 & @CRLF & $time2 & @CRLF & $time3) ; здесь выводится как надо
;Else
;   MsgBox(0,'error','1')
   Sleep(1000)
;EndIf
;
;$_time_t = $time2
;If Not @error Then
;   Beep(500,1000)
;Else
;   MsgBox(0,'error','2')
;
;$_time_t = $time3
;If Not @error Then
;   Beep(500,1500)
;Else
;   MsgBox(0,'error','3')
WEnd
подскажите пожалуйста :stars: :-\
запутался я :-X :-[
....и еще, если моя задача по силам AutoIt-у, нужно ли это записывать отдельной фукцией, чтоб потом подключать в другом скрипте?
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Посмотрите вот эту функцию:
Код:
AdlibRegister()
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
Dima1337 сказал(а):
Посмотрите вот эту функцию:
Код:
AdlibRegister()
:beer: я удержался от просьбы, предлагать мне просто названия функций(AdlibRegister, TimerDiff, TimerInit) Поверьте, перечитывал, тестировал примеры, но я не понимаю их.... вернее пока тестирую пример, все понятно :-X, когда начинаешь применять где то в своей задаче, начинаю путаться. Для меня например трудно понять(часто) что делает то, что находится в скобках функции. Кароч, я зелен пока, но понять научится хочется :D
а пока вот что получилось рабочее, возможно кто-то подскажет как красиво написать, или я когда то дойду сам. Но сегодня спать ;)
Код:
#include <Date.au3>
HotKeySet('{Esc}','_quit')
Global $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
Global $Sec, $Min, $Hour, $Time
Global $time1, $time2, $time3
Func _quit()
   Exit
EndFunc

Func _WrTimer1()
   $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
If $time1 < $_time_t Then
   $time1 = $_time_t + 3000
   IniWrite("myfile.ini", "timers", "timer1", $time1)
EndIf
EndFunc

Func _WrTimer2()
   $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
If $time2 < $_time_t Then
   $time2 = $_time_t + 6000
   IniWrite("myfile.ini", "timers", "timer2", $time2)
   EndIf
EndFunc

Func _WrTimer3()
   $_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
If $time3 < $_time_t Then
   $time3 = $_time_t + 10000
IniWrite("myfile.ini", "timers", "timer3", $time3)
EndIf
EndFunc

Func _ReadTimer1()
IniRead('myfile.ini','timers','timer1','не найдено')
IniRead('myfile.ini','timers','timer2','не найдено')
IniRead('myfile.ini','timers','timer3','не найдено')
EndFunc
Func _WrAll()
Sleep(100)
_WrTimer1()
Sleep(100)
_WrTimer2()
Sleep(100)
_WrTimer3()
Sleep(100)
EndFunc
 _WrAll()

While 1
Sleep(1000)
$_time_t = _TimeToTicks(@HOUR,@MIN,@SEC)
_ReadTimer1()

If $_time_t = $time1 Then
   Beep(1000,300)
   _WrTimer1()
EndIf
 If $_time_t = $time2 Then
   Beep(500,500)
   _WrTimer2()
EndIf
If $_time_t = $time3 Then
   Beep(300,1500)
   _WrTimer3()
   EndIf
WEnd
то-есть наконец то научился работать с INIфайлом в АutoIt, это уже победа :-[


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

Dima1337 сказал(а):
Посмотрите вот эту функцию:
Код:
AdlibRegister()
Не то что нужно :-X
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
То есть вам нужны 3 независимых друг от друга таймера в одном скрипте?
Я правильно понял?
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
Dima1337 сказал(а):
То есть вам нужны 3 независимых друг от друга таймера в одном скрипте?
Я правильно понял?
ну да
основной скрипт выполняется, в определенное время выполнить Func_1(), Func_2() итд. Определенное время задается таймером(и)
Кстати в приведенном последнем, почему то не стабильно выполнятся команды срабатывания функций(в скрипте Бипы), я думаю, что время одного таймера нагоняет время другого, а одновременный вызов двух функций видимо не допустим.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Код:
HotKeySet('{ESC}', '_Exit')

AdlibRegister('Timer1', 30000) ;~ 30 сек.
AdlibRegister('Timer2', 60000) ;~ 1 мин.
AdlibRegister('Timer3', 120000) ;~ 2 мин.

While 1
	Sleep(100)
WEnd

Func Timer1()
	IniWrite("myfile.ini", "timers", "timer1", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer1' & @CRLF)
EndFunc

Func Timer2()
	IniWrite("myfile.ini", "timers", "timer2", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer2' & @CRLF)
EndFunc

Func Timer3()
	IniWrite("myfile.ini", "timers", "timer3", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer3' & @CRLF)
EndFunc

Func _Exit()
	Exit
EndFunc


Вариант с очередью

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

Global $TimerID = 0

AdlibRegister('Timer1', 30000) ;~ 30 сек.
AdlibRegister('Timer2', 60000) ;~ 1 мин.
AdlibRegister('Timer3', 120000) ;~ 2 мин.

While 1
	Sleep(100)
WEnd

Func Timer1()
	If $TimerID == 0 Then
		IniWrite("myfile.ini", "timers", "timer1", @HOUR & ':' & @MIN & ':' & @SEC)
		ConsoleWrite('Timer1' & @CRLF)
		$TimerID = 1
	EndIf
EndFunc

Func Timer2()
	If $TimerID == 1 Then
		IniWrite("myfile.ini", "timers", "timer2", @HOUR & ':' & @MIN & ':' & @SEC)
		ConsoleWrite('Timer2' & @CRLF)
		$TimerID = 2
	EndIf
EndFunc

Func Timer3()
	If $TimerID == 2 Then
		IniWrite("myfile.ini", "timers", "timer3", @HOUR & ':' & @MIN & ':' & @SEC)
		ConsoleWrite('Timer3' & @CRLF)
		$TimerID = 0
	EndIf
EndFunc

Func _Exit()
	Exit
EndFunc

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

AdlibRegister('Timer1', 30000) ;~ 30 сек.

While 1
	Sleep(100)
WEnd

Func Timer1()
	IniWrite("myfile.ini", "timers", "timer1", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer1' & @CRLF)
	AdlibRegister('Timer2', 60000) ;~ 1 мин.
	AdlibUnRegister('Timer1')
EndFunc

Func Timer2()
	IniWrite("myfile.ini", "timers", "timer2", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer2' & @CRLF)
	AdlibRegister('Timer3', 120000) ;~ 2 мин.
	AdlibUnRegister('Timer2')
EndFunc

Func Timer3()
	IniWrite("myfile.ini", "timers", "timer3", @HOUR & ':' & @MIN & ':' & @SEC)
	ConsoleWrite('Timer3' & @CRLF)
	AdlibRegister('Timer1', 30000) ;~ 30 сек.
	AdlibUnRegister('Timer3')
EndFunc

Func _Exit()
	Exit
EndFunc
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
Viktor1703 огромное спасибо! :ok: :beer:
первый пример я ночью мучал, но как раз таки была проблема с очередностью.
а второй пример, по моему, то что мне нужно. :ok: :IL_AutoIt_1:
Код:
;сделал одинаковое время срабатывания
AdlibRegister('Timer1', 30000) ;~ 30 сек.  
AdlibRegister('Timer2', 30000) ;~ 30 сек.
AdlibRegister('Timer3', 120000) ;~ 2 мин.

While 1
    Sleep(100)
WEnd

Func Timer1()
    If $TimerID == 0 Then
        IniWrite("myfile.ini", "timers", "timer1", @HOUR & ':' & @MIN & ':' & @SEC)
        ConsoleWrite('Timer1' & @CRLF)
		MsgBox(0,'Timer1','выполняем это',60)
        $TimerID = 1
    EndIf
EndFunc

Func Timer2()
    If $TimerID == 1 Then
        IniWrite("myfile.ini", "timers", "timer2", @HOUR & ':' & @MIN & ':' & @SEC)
        ConsoleWrite('Timer2' & @CRLF)
	    MsgBox(0,'Timer2','выполняем это',60)
        $TimerID = 2
    EndIf
EndFunc
третий пока не очень понял, но буду разбираться позже
ответ вполне удовлетворил, но если можно закрою, когда сделаю большой тест, всего скрипта :-[
вдруг какая непонятка возникнет дополнительно.
Еще раз спасибо!


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

Тему помечаю Решенной!
Только еще пожалуйста пните в правильном направлении по вопросу
как нужно ли это записывать отдельной фукцией, чтоб потом подключать в другом скрипте?
то есть как правильно оформить код по этой теме, что бы его потом подключить в основном скрипте?
пока я не понимаю и этот момент, а он очень часто полезен:
Код:
; script _timers.au3
;begin script
#include-once ; нужно ли это указывать?
...
;end script

;основной скрипт
#include "_timers.au3"
;как к нему обращаться?
;указывать названия функций из "_timers.au3?
; или как?
:-[
 

Dima1337

Осваивающий
Сообщения
186
Репутация
24
Попробуйте обмениваться между двумя скриптами информацией через ini
Нечто вроде 1 скрипт проверил записал, второй проверил-прочитал-обработал-записал и тд
Инфа не точная а может и не правдивая но где то на форуме видел что через
Код:
ConsoleWrite

Тоже как то передавать можно...
Примерно в этом направлении копать, а там уже еще кто подскажет...


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

Код:
#include "[путь\]имя файла"
#include <имя файла>

Используется для библиотек (По простому это нужно что бы самому не выдумывать велосипед и использовать готовые функции из скрипта где все прописано)
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
kopeheb [?]
то есть как правильно оформить код по этой теме
Вот например:
Код:
; mylib.au3
#include-once ; предотвращение повторного включения в скрипт...

Func _myfunc1()
	; какие-то действия...
	ConsoleWrite("_myfunc1: 12345"&@CRLF)
EndFunc

Func _Test($a, $b, $c, $d = "значение поумолчанию, если не указать при вызове")        ; функция с параметрами
	Return StringFormat("Переданные параметры в функцию _Test : %s=%s, %s=%s, %s=%s, %s=%s;\r\n", "a", $a, "b", $b, "c", $c, "d", $d)
EndFunc
Код:
; main_script.au3
#include "mylib.au3" ; подключаем наш файл

; и вызываем наши функции
_myfunc1()
MsgBox(0, "", _Test("вызываем", "функцию", "с параметрами"))
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
Спасибо alex33, но я еще бы хотел до конца понять
раз
; предотвращение повторного включения в скрипт...
, значит подключаемая функция срабатывает только раз(я так понял) но подключаемая функция это таймеры, которые должны работать всегда. Значит, это не мой вариант? значит мои таймеры в основном скрипте нужно как-то прикрутить? :-[


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

ок, попробую оформить, сделать тест, тогда или в стену лбом или :beer: :-[
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
kopeheb сказал(а):
Спасибо alex33, но я еще бы хотел до конца понять
раз
; предотвращение повторного включения в скрипт...
, значит подключаемая функция срабатывает только раз(я так понял) но подключаемая функция это таймеры, которые должны работать всегда. Значит, это не мой вариант? значит мои таймеры в основном скрипте нужно как-то прикрутить? :-[
Нет, вы немного не так поняли. Вот, я это попытался объяснить здесь: Ответ #5.
Т.Е. Если убрать #include-once и нечаянно подключить два или более раз какую-нибудь UDF с функцией, появится такая ошибка:
Код:
error: _my_test_func() already defined.
или такая:
Код:
Error: Duplicate function name.
А если использовать #include-once - такое не случится.

Вот ещё объясняющие цитаты, правда из PHP, но это не так важно, у AutoIt похожее поведение.
include_once:
Выражение include_once включает и выполняет указанный файл во время выполнения скрипта. Его поведение идентично выражению include, с той лишь разницей, что если код из файла уже один раз был включен, он не будет включен и выполнен повторно. Как видно из имени, он включит файл только один раз (include once).
include_once может использоваться в тех случаях, когда один и тот же файл может быть включен и выполнен более одного раза во время выполнения скрипта, в данном случае это поможет избежать проблем с переопределением функций, переменных и т.д.
Смотри документацию по include для информации как эта функция работает.
include:
Выражение include включает и выполняет указанный файл.
Когда файл включается, его код наследует ту же область видимости переменных, что и строка, на которой произошло включение. Все переменные, доступные на этой строке во включающем файле будут также доступны во включаемом файле. Однако все функции и классы, объявленные во включаемом файле, будут доступны в глобальной области видимости.
Если включение происходит внутри функции включающего файла, тогда весь код, содержащийся во включаемом файле, будет вести себя так, как будто он был определен внутри этой функции. То есть, он будет в той же области видимости переменных этой функции.
Если во включаемом файле определены функции, они могут быть использованы в главном файле вне зависимости от того, были ли они объявлены до return или после. Если файл включается дважды, PHP 5 выдаст фатальную ошибку, потому что функции уже были определены, в то время как PHP 4 не обратил бы внимания на функции, определенные после return. Рекомендуется использовать include_once вместо того, чтобы проверять был ли уже файл включен ранее.
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
Алексей, спасибо за правильный пинок! вернее провождение за руку :ok: :beer:
Вот, я это попытался объяснить здесь: Ответ #5.
к сожалению блокируется, но из статьи из http://php.net/manual/ru/function.include-once.php подтвердили мои предположения- это типа как пригласили консультанта для беседы, и он выступает когда он нужен(#include-once), а не навязчив(#include) и не засыпает после первого же ответа :rofl:. Возможно неподходящий пример, но я это так увидел.
Жаль что в справке AutiIt не разжевано примерно так же.
OffTopic:
не разобрался как оформить ссылку типа [урл=хттп//:ссылка]название ссылки[/офф] на будущее пригодилось бы :-[
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
kopeheb [?]
не разобрался как оформить ссылку типа [урл=хттп//:ссылка]название ссылки[/офф] на будущее пригодилось бы
[url=http://php.net/manual/ru/function.include-once.php] название ссылки[/url]
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
OffTopic:
kopeheb сказал(а):
Вот, я это попытался объяснить здесь: Ответ #5.
к сожалению блокируется
Всё, исправил...

kopeheb сказал(а):
OffTopic:
не разобрался как оформить ссылку типа [урл=хттп//:ссылка]название ссылки[/офф]
OffTopic:

Нажмите на такую кнопку:
url.gif
(над полем для сообщения)...
http://example.org/ - [url]http://example.org/[/url]
пример - [url=http://example.org/]пример[/url]
 
Автор
K

kopeheb

Новичок
Сообщения
17
Репутация
0
alex33
спасибо! бегло ознакомился. При случае все испытаю :ok:
Garrett, alex33
я так и пробовал, то чтот не получилось когда пытался :scratch:
эта тема сейчас получилось, странно :D :-[
OffTopic:
а теперь так несуществующий сайт

аааа, я понял! меня смутил [nofollow], видимо такое метится на ссылки не принадлежащие этому форуму...
учел и запомнил, сорри за спам. спасибо еще раз!
 
Верх