Что нового

Как объединить два, три и более цикла.

A

at

Гость
Здравствуйте. Подскажите, как правильно объединить два, три и более цикла в одном скрипте.
Не могу понять сам принцип.

P.S. Можно на моем скрипте.
Код:
While 1 ;цикл № 1
	$vTextG = ControlGetText('G', '', '[CLASS:TEdit; INSTANCE:15]') ;получаем значение целого числа из окна приложения 'G'
    $vTextS = ControlGetText('S', '', '[CLASS:TEdit; INSTANCE:15]') ;получаем значение целого числа из окна приложения 'S'
    $vSumma = Execute('$vTextG+$vTextS')  ; суммируем все полученные значения
    $vFileSumlog = FileOpen('C:\Sumlog_A.txt', 1) ;Открываем файл Sumlog_A.txt
    
	  FileWrite($vFileSumlog,$vSumma & @CRLF) ;Записываем сумму в файл Sumlog_A.txt
	   FileClose($vFileSumlog) ;Закрываем файл Sumlog_A.txt
	    Sleep(60000) ;ждем 5 минут
WEnd

            -----------------------------------------------------------------------------------------

While 1 ;цикл № 2
	    Sleep(100) ;пауза, чтобы процессор не грузился
    $vExit = WinGetHandle('Сбой приема', 'Exit') ;получаем хэндл текущего окна 'Сбой приема'
     If $vExit Then ;если есть окно 'Сбой приема'(его хэндл), тогда
         Sleep(10000) ;делаем паузу 10 секунд, за это времямя все должны появиться все возможные окна 'Сбой приема'
         Close() ;вызываем функцию Close
     EndIf
WEnd
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Если ты хочешь чтобы эти два отдельных цикла работали. Особо не мешали друг другу. А в остальное время скрипт ничего не делал? Тогда делай из циклов процедурки и запускай по таймеру
Код:
AdlibRegister
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
at
Нет
Код:
$start1 = TimerInit()
$start2 = TimerInit()
While 1 ;цикл № 1
	If TimerDiff($start1) > 60000
		$vTextG = ControlGetText('G', '', '[CLASS:TEdit; INSTANCE:15]') ;получаем значение целого числа из окна приложения 'G'
		$vTextS = ControlGetText('S', '', '[CLASS:TEdit; INSTANCE:15]') ;получаем значение целого числа из окна приложения 'S'
		$vSumma = Execute('$vTextG+$vTextS')  ; суммируем все полученные значения
		$vFileSumlog = FileOpen('C:\Sumlog_A.txt', 1) ;Открываем файл Sumlog_A.txt
		FileWrite($vFileSumlog,$vSumma & @CRLF) ;Записываем сумму в файл Sumlog_A.txt
		FileClose($vFileSumlog) ;Закрываем файл Sumlog_A.txt
		$start1 = TimerInit()
	EndIf
	If TimerDiff($start2) > 10000
		$vExit = WinGetHandle('Сбой приема', 'Exit') ;получаем хэндл текущего окна 'Сбой приема'
		If $vExit Then ;если есть окно 'Сбой приема'(его хэндл), тогда
			Close() ;вызываем функцию Close
		EndIf
		$start2 = TimerInit()
	EndIf
    Sleep(100)
WEnd
 
Автор
A

at

Гость
делай из циклов процедурки и запускай по таймеру
/... не понял, что такое 'процедурки'.

Спасибо Всем. Решение от Kasterа работает, как часы, но мне, как начинающему сложно понять, к примеру, как пять разных циклов, объединить в одно целое.
С функциями разобрался, с таймером тоже. Подскажите, где ещё можно прочесть по этой теме. На форуме, не смог, к сожалению, найти нужной информации.
 
Автор
A

at

Гость
Подскажите, сколько таймеров можно запустить в одном цикле ?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
пока хватит сил придумывать новое название для переменных
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
622
at
ты должен помнить, что полностью независимыми такие циклы не являются. каждый последующий цикл будет ждать выполнение предыдущих при успешной выполнении условия
 

kaster

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

axlwor

Скриптер
Сообщения
657
Репутация
147
пусть autoit работает сам
Код:
AdlibRegister("_Cycle001", 60000)
AdlibRegister("_Cycle002", 10000)
AdlibRegister("_Cycle003", 1000)
AdlibRegister("_Cycle004", 1000)
AdlibRegister("_Cycle005", 1000)
AdlibRegister("_Cycle006", 1000)

While 1
	Sleep(1000)
WEnd

Func _Cycle001()
	$vTextG = ControlGetText('G', '', '[CLASS:TEdit; INSTANCE:15]')
	$vTextS = ControlGetText('S', '', '[CLASS:TEdit; INSTANCE:15]')
	$vSumma = Execute('$vTextG+$vTextS')
	$vFileSumlog = FileOpen('C:\Sumlog_A.txt', 1)
	FileWrite($vFileSumlog,$vSumma & @CRLF)
	FileClose($vFileSumlog)
EndFunc
   
Func _Cycle002()
	$vExit = WinGetHandle('Сбой приема', 'Exit')
	If $vExit Then
		; я бы именно ждал, что то вроде WinWait()
		Sleep(10000)
		Close()
	EndIf
EndFunc

Func _Cycle003()
EndFunc

Func _Cycle004()
EndFunc

Func _Cycle005()
EndFunc

Func _Cycle006()
EndFunc

Func Close()
EndFunc
 
Автор
A

at

Гость
А что предпочтительнее использовать: AdlibRegister или TimerInit ?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
все зависит от задачи и реализации.
плюсы adlib - независимо от основного тела программы процедура запустится.
timerinit - всего лишь таймер
 
Верх