Что нового

Запуск 4х функций с определенным интервалом времени поочереди

nowost

Знающий
Сообщения
178
Репутация
17
Приветсвую дамы и господа, столкнулся с проблемой мне необходимо поочередно запускать 4 функции по заданому времени
я написал небольшой костыль работает как нужно, единственное очень большое нагромождение кода получается.
Код:
Local $coord1=False
	Local $coord2=False
	Local $coord3=False
	Local $coord4=False
	Local $coordtime1=2000
	Local $coordtime2=4000
	Local $coordtime3=6000
	Local $coordtime4=8000
	$coordtimer=TimerInit()
           $coordtimer2=TimerInit()
          $coordtimer3=TimerInit()
	$coordtimer4=TimerInit()
	Func _coord1()
	   Send('1')
	EndFunc
	Func _coord2()
	   Send('2')
	EndFunc
	Func _coord3()
	   Send('3')
	EndFunc
	Func _coord4()
	   Send('4')
	   EndFunc
	
	While 1
	   
	    If TimerDiff($coordtimer)>$coordtime1 Then $coord1=True
	    If TimerDiff($coordtimer2)>$coordtime2 Then $coord2=True
		If TimerDiff($coordtimer3)>$coordtime3 Then $coord3=True
		If TimerDiff($coordtimer4)>$coordtime4 Then $coord4=True
	      
     If $coord1 Then
		_coord1()
	    $coord1=False
		$coordtimer=TimerInit()-10
		
	    EndIf
	 If $coord2 Then
		_coord2()
        $coord2=False
		$coordtimer=TimerInit()-10
		$coordtimer2=TimerInit()-10
		
		EndIf
	 If $coord3 Then
		_coord3()
		$coord3=False
		$coordtimer=TimerInit()-10
		$coordtimer2=TimerInit()-10
	    $coordtimer3=TimerInit()-10
	
     EndIf
	 If $coord4 Then
		_coord4()
		$coord4=False
      	$coordtimer=TimerInit()
        $coordtimer2=TimerInit()
        $coordtimer3=TimerInit()
	    $coordtimer4=TimerInit()
	  
     EndIf
	   WEnd

мне нужно чтобы по заданному времени срабатывала _coord1() затем _coord2() ...итд
как можно реализовать это более простым способом :smile: ?
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Попробуйте так
Код:
#include <Timers.au3>
$hGUI = GUICreate("")
_Timer_SetTimer($hGUI, 1000, "Timer_1")
_Timer_SetTimer($hGUI, 3000, "Timer_2")
While Sleep(50)
WEnd
Func Timer_1($hWnd, $Msg, $iIDTimer, $dwTime)
	ConsoleWrite("1 -ая функция" & @LF)
EndFunc   ;==>Timer_1
Func Timer_2($hWnd, $Msg, $iIDTimer, $dwTime)
	ConsoleWrite("2 -ая функция" & @LF)
EndFunc   ;==>Timer_2


Или посмотрите функцию
Код:
AdlibRegister
 
Автор
N

nowost

Знающий
Сообщения
178
Репутация
17
а как вообще впринципе можно остановить таймер ?
в вашем примере 1я функция срабатывает чаще чем 2я в 3 раза из-за выставленого интервала. а нужно чтобы 1я сработала, затем 2я
у себя я делал
Код:
$coordtimer=TimerInit()-10

т.е сбрасывал таймер и вычитал 10 чтобы он не успел дойти до заданного времени и так постоянно
может както его вообще можно остановить или на паузу поставить

Код:
AdlibRegister

к сожалению не подходит
 

InnI

AutoIT Гуру
Сообщения
4,923
Репутация
1,432
nowost [?]
т.е сбрасывал таймер и вычитал 10 чтобы он не успел дойти до заданного времени и так постоянно
может както его вообще можно остановить или на паузу поставить
На сколько я понимаю, понятие "таймер" в AutoIt - условно. Из справки:
TimerInit
Возвращает отметку времени (в миллисекундах).
Другими словами ничего не "тикает", и останавливать или ставить на паузу ничего не надо. Код
Код:
$coordtimer=TimerInit()

всего лишь записывает в переменную число - количество миллисекунд, прошедших с какого-то времени. И это число потом сравнивается с "текущим" числом миллисекунд в функции TimerDiff().
Точнее, не сравнивается, а берётся разница между тем числом миллисекунд и текущим на момент вызова.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Странно, меня путает слово поочереди. Весь код и так выполняется последовательно. Вы же не используете таймеры и AdlibRegister.

Если вам нужно вызывать последовательно четыре функции с интервалом в 2 секунды, то можно сделать примерно так:

Код:
$iStep = 0
While Sleep(2000)
	$iStep+=1
	Switch $iStep
		Case 1
			;1 функция
			ConsoleWrite(1 & @LF)
		Case 2
			;2 функция
			ConsoleWrite(2 & @LF)
		Case 3
			;3 функция
			ConsoleWrite(3 & @LF)
		Case 4
			;4 функция
			ConsoleWrite(4 & @LF)
			$iStep = 0
	EndSwitch
WEnd



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

Ну или так: ;D

Код:
;1 функция
Sleep(2000)
;2 функция
Sleep(2000)
;3 функция
Sleep(2000)
;4 функция
 
Автор
N

nowost

Знающий
Сообщения
178
Репутация
17
эти функции работают в большом глобальном цикле и при наступлении заданного времени они срабатывают.
просто нужно чтобы они одна за другой шли и необязательно через 2секунды может 1я секунду вторая 3 итд.
другими словами 1я затем через отрезок времени 2я ...3я...4я...1я...итд...интервал не обязательно равные промежутки времени.
 
Верх