Что нового

Запуск функций с различной частотой

Smertig

Новичок
Сообщения
8
Репутация
0
Всем доброго времени суток.
Возникла небольшая проблема. Нужно, чтобы программа во время своей работы вызывала поочередно определенные функции. Изначально сделал так:
Код:
While 1
	If $getwin = 1 Then
		func1()
		func2()
		If check() <> 2 Then
			func3()
			func4()
			func5()
		EndIf
	EndIf
	Sleep(100)
WEnd

Func1, func2.. func5 выполняются от 10 до 500 мс, причем часто с разной скоростью. Но, к примеру, func1 не так важна, поэтому можно запускать её не постоянно, а каждые 3-4 сек. Как сие реализовать? Adlib-функции пробовал, то ли я кривой, то ли не работает. Как вообще заставить функции запускаться с определенным интервалом независимо друг от друга? Как вариант - таймеры, но может есть что-то попроще?
Заранее благодарю :smile:
OffTopic:
префикс не подобрал :D
 
Автор
S

Smertig

Новичок
Сообщения
8
Репутация
0
Никак. AutoIt не поддерживает многопоточность. Все функции выполняются последовательно.
Спасибо, так и предполагал :(
Но вопрос о запуске функций через различные промежутки времени остается открытым.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Отсутствие многопоточности не означает невозможность запуска в разные промежутки, а только то, что каждая запись будет выполняться последовательно. например, если первая функция будет выполняться пол часа, то ждать придется пол часа, даже если задержка 10 сек. можно так попробовать
Код:
$delay1 = 100
$delay2 = 200
$delay3 = 300
$delay4 = 400
$delay5 = 500
$start1 = TimerInit()
$start2 = TimerInit()
$start3 = TimerInit()
$start4 = TimerInit()
$start5 = TimerInit()
While 1
    If $getwin = 1 Then
        If TimerDiff($start1) >= $delay1 Then
            func1()
            $start1 = TimerInit()
        EndIf
        If TimerDiff($start2) >= $delay2 Then
            func2()
            $start2 = TimerInit()
        EndIf
        If check() <> 2 Then
            If TimerDiff($start3) >= $delay3 Then
                func3()
                $start3 = TimerInit()
            EndIf
            If TimerDiff($start4) >= $delay4 Then
                func4()
                $start4 = TimerInit()
            EndIf
            If TimerDiff($start5) >= $delay5 Then
                func5()
                $start5 = TimerInit()
            EndIf
        EndIf
    EndIf
    Sleep(10)
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Kaster [?]
если первая функция будет выполняться пол часа, то ждать придется пол часа
Но ведь при использовании AdlibRegister() ситуация обратная: каждый вызов AdlibRegister() будет задерживать функцию скрипта на время выполнения AdlibRegister(). Вот в этом примере функция выполняется 3 секунды, а весь скрипт 6 секунд
Код:
AdlibRegister("adlib", 1000)

$t = TimerInit()
test()
ConsoleWrite(TimerDiff($t))

Func test()
  For $i=1 To 200
    Sleep(15)
  Next
EndFunc

Func adlib()
  Sleep(500)
  ConsoleWrite(TimerDiff($t) & @CRLF)
EndFunc
Тут уже надо смотреть по ситуации - что человеку нужно - либо ждать выполнения, либо прерывать.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
InnI
в Adlib нельзя передавать параметры. и потом, я точно не уверен, но что будет если несколько функций зарегистрировать там. они будут друг друга прерывать?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Kaster [?]
они будут друг друга прерывать?
Самое интересное, что нет. Вот: одна функция вызывается чаще другой и выполняется быстрей. Но нигде не прерывает
Код:
AdlibRegister("func1", 300)
AdlibRegister("func2", 2000)

Do
  Sleep(100)
Until 0

Func func1()
  ConsoleWrite("f1 begin:")
  Sleep(100)
  ConsoleWrite("f1 end" & @CRLF)
EndFunc

Func func2()
  ConsoleWrite("f2 begin:")
  For $i=1 To 100
    Sleep(15)
  Next
  ConsoleWrite("f2 end" & @CRLF)
EndFunc
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
InnI [?]
Самое интересное, что нет
тогда смысла от того, что их всех засунуть в Adlib нет, т.к. все равно одна функция будет ждать выполнение другой. но опять же, параметры.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Kaster [?]
тогда смысла от того, что их всех засунуть в Adlib нет
Ну, можно же не все засовывать... вы предложили своё видение решения, я - своё.
А выбор предоставим автору темы.
 
Верх