Что нового

[Автоматизация] Как можно начать цикл заново, если выполнилось одно из условий?

Teacher

Новичок
Сообщения
33
Репутация
0
В функции CheckIt() есть 4 условия. В функции Start() есть цикл "While 1". Мне необходимо после выполнения одного из условий в функции CheckIt() - начинать цикл "While 1" в функции Start() - заново (с начала)! Как это можно реализовать? :-\
Вот код:
Код:
AdlibRegister("CheckIt", 1000)
HotKeySet("{F4}", "Start")
HotKeySet("{ESC}", "_Exit")

While 1
   Sleep(350)
   WEnd


Func Start()
While 1 ; <= начало цикла
$1 = PixelSearch(272,159,365,190,0xFF0000)
If IsArray($1) = True Then
$11 = PixelSearch(526,165,537,177,0xFF0000)
If IsArray($11) = True Then
MouseClick("left", 841, 635, 1, 0)
WaitColor(0x00FF00)
MouseClick("left", 925, 618, 1, 0)
EndIf
EndIf

$2 = PixelSearch(272,159,365,190,0x00FF00)
If IsArray($2) = True Then
$22 = PixelSearch(526,165,537,177,0x00FF00)
If IsArray($22) = True Then
MouseClick("left", 925, 618, 1, 0)
WaitColor(0xFF0000)
MouseClick("left", 841, 635, 1, 0)
EndIf
EndIf
    WEnd ; <= конец цикла
    EndFunc

Func WaitColor($Color)
  Do
    PixelSearch(526,165,537,177, $Color)
  Until Not @error
EndFunc

Func CheckIt()
  $close = PixelSearch(1220, 327, 1248, 351, 0xCCCCCC)
  If IsArray($close) = True Then
    Sleep(400)
    MouseClick("left", 1195, 479, 1, 0)
    Sleep(400)
  EndIf

  $eror = PixelSearch(797, 500, 851, 519, 0x404040)
  If IsArray($eror) = True Then
    MouseClick("left", 1150, 479, 1, 0)
  EndIf

  $ok = PixelSearch(690, 510, 1185, 591, 0x0084FF)
  If IsArray($ok) = True Then
    $posok = PixelSearch(690, 510, 1185, 591, 0x0084FF)
    If IsArray($posok) = True Then
      MouseMove($posok[0], $posok[1], 1)
      MouseClick("left")
      Sleep(30)
    EndIf
  EndIf
EndFunc

  Func _Exit()
         Exit
      EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Teacher [?]
заново (с начала)
Я думаю, вам надо прерывать ожидание цвета. Тогда цикл сам перейдёт "на начало". Попробуйте так
Код:
Opt("TrayIconDebug", 1)
AdlibRegister("CheckIt", 1000)
HotKeySet("{F4}", "Start")
HotKeySet("{ESC}", "_Exit")

Global $Checker = False

While 1
  Sleep(350)
WEnd

Func Start()
  While 1
    $1 = PixelSearch(272, 159, 365, 190, 0xFF0000)
    If IsArray($1) Then
      $11 = PixelSearch(526, 165, 537, 177, 0xFF0000)
      If IsArray($11) Then
        MouseClick("left", 841, 635, 1, 0)
        WaitColor(0x00FF00)
        MouseClick("left", 925, 618, 1, 0)
      EndIf
    EndIf

    $2 = PixelSearch(272, 159, 365, 190, 0x00FF00)
    If IsArray($2) Then
      $22 = PixelSearch(526, 165, 537, 177, 0x00FF00)
      If IsArray($22) Then
        MouseClick("left", 925, 618, 1, 0)
        WaitColor(0xFF0000)
        MouseClick("left", 841, 635, 1, 0)
      EndIf
    EndIf

    If $Checker Then $Checker = False
  WEnd
EndFunc

Func WaitColor($Color)
  Do
    PixelSearch(526, 165, 537, 177, $Color)
  Until Not @error Or $Checker
EndFunc

Func CheckIt()
  $close = PixelSearch(1220, 327, 1248, 351, 0xCCCCCC)
  If IsArray($close) Then
    Sleep(400)
    MouseClick("left", 1195, 479, 1, 0)
    Sleep(400)
    $Checker = True
  EndIf

  $eror = PixelSearch(797, 500, 851, 519, 0x404040)
  If IsArray($eror) Then
    MouseClick("left", 1150, 479, 1, 0)
    $Checker = True
  EndIf

  $ok = PixelSearch(690, 510, 1185, 591, 0x0084FF)
  If IsArray($ok) Then
    $posok = PixelSearch(690, 510, 1185, 591, 0x0084FF)
    If IsArray($posok) Then
      MouseMove($posok[0], $posok[1], 1)
      MouseClick("left")
      Sleep(30)
      $Checker = True
    EndIf
  EndIf
EndFunc

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

Teacher

Новичок
Сообщения
33
Репутация
0
Теперь после запуска программы все выполняется нормально, а после того как выполнилось одно из условий в Func CheckIt() - сразу же происходит
Код:
MouseClick("left", 925, 618, 1, 0)
просто сразу же по дефолту само по себе. Тобишь получается что цикл не переходит на начало, а выполняется последующее действие после WaitColor . :(
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Teacher [?]
выполняется последующее действие после WaitColor
Правильно. Так и должно быть. А что, вам этот клик "погоду делает"? Если так критично, то добавьте условие перед кликом
Код:
...
        If Not $Checker Then MouseClick("left", 925, 618, 1, 0)
...
        If Not $Checker Then MouseClick("left", 841, 635, 1, 0)
...
 

ArvenPK

Новичок
Сообщения
14
Репутация
1
Сколько тем нужно создать, чтобы научиться управлять циклами?

Вот ещё вариант. Суть та же, но без Adlib:
Код:
HotKeySet("{F4}", "Start")
HotKeySet("{ESC}", "_Exit")

While Sleep(350)
WEnd

Func Start()
	HotKeySet("{F4}")
	While 1
		PixelSearch(272, 159, 365, 190, 0xFF0000)
		If Not @error Then
			PixelSearch(526, 165, 537, 177, 0xFF0000)
			If Not @error Then
				MouseClick("left", 841, 635, 1, 0)
				If Not WaitColor(0x00FF00) Then ContinueLoop
				MouseClick("left", 925, 618, 1, 0)
			EndIf
		EndIf

		PixelSearch(272, 159, 365, 190, 0x00FF00)
		If Not @error Then
			PixelSearch(526, 165, 537, 177, 0x00FF00)
			If Not @error Then
				MouseClick("left", 925, 618, 1, 0)
				If Not WaitColor(0xFF0000) Then ContinueLoop
				MouseClick("left", 841, 635, 1, 0)
			EndIf
		EndIf

		CheckIt()
	WEnd
EndFunc

Func WaitColor($Color)
	Do
		If CheckIt() Then Return False
		PixelSearch(526, 165, 537, 177, $Color)
	Until Not @error
	Return True
EndFunc

Func CheckIt()
	Local $checked = False

	PixelSearch(1220, 327, 1248, 351, 0xCCCCCC)
	If Not @error Then
		Sleep(400)
		MouseClick("left", 1195, 479, 1, 0)
		Sleep(400)
		$checked = True
	EndIf

	PixelSearch(797, 500, 851, 519, 0x404040)
	If Not @error Then
		MouseClick("left", 1150, 479, 1, 0)
		$checked = True
	EndIf

	PixelSearch(690, 510, 1185, 591, 0x0084FF)
	If Not @error Then
		Local $posok = PixelSearch(690, 510, 1185, 591, 0x0084FF)
		If Not @error Then
			MouseMove($posok[0], $posok[1], 1)
			MouseClick("left")
			Sleep(30)
			$checked = True
		EndIf
	EndIf

	Return $checked
EndFunc

Func _Exit()
	Exit
EndFunc
 
Верх