Что нового

[Автоматизация] Почему TimerInit или TimerDiff влияют на работу другой части скрипта?

vlv993

Новичок
Сообщения
20
Репутация
0
Есть часть скрипта: цикл, работающий идеально
Код:
While 1
$coord = PixelSearch(23, 628, 23, 628, 0xD5DDC8, $shade)
   If Not @error Then
		 Send("{SPACE}")
		 sleep(1120+RandSleep)
		 MouseClick($button, 178+Random(-1, 3, 1), 679+Random(-1, 3, 1), $clicks, $speed)
		 sleep(1333+RandSleep)
		 MouseClick($button, 412+Random(-1, 3, 1), 270+Random(-1, 3, 1), $clicks, $speed)
		 sleep(733+RandSleep)
     	 MouseClick($button, 411+Random(-1, 3, 1), 268+Random(-1, 3, 1), $clicks, $speed)
		 sleep(733+RandSleep)
     	 MouseClick($button, 410+Random(-1, 3, 1), 269+Random(-1, 3, 1), $clicks, $speed)
		 sleep(2333+RandSleep)
		 Send("{SPACE}")
		 sleep(733+RandSleep)
		 RandClick1()
	  Else
	       PixelSearch($x4, $y4 - 2, $x4, $y4 - 2, 0xFFFFFF, $shade)
    Select
	Case  @error
	   Send("{g down}")
	EndSelect
	     PixelSearch(438, 572, 438, 572, 0xC3C1B4, $shade); 1-423-B3AFA4  2-428-C3C1B4  3-433-C3C1B4  4-438-C3C1B4  5-443-C3C1B4  6-448-C6C4B7    458-C3C1B4   508-C1C3B5
    Select
	Case @error
	     Send("{g up}")
		 Send("{h down}")
		EndSelect
             PixelSearch(433, 552, 433, 552, 0xC8C9BB, $shade); 1-423-B8B6AA  2-428-C7C8BA  3-433-C8C9BB  4-438-C8C9BB        508-C8C9BB
    Select
	Case @error
	     Send("{h up}")
		 Send("{g down}")
	  EndSelect
	         PixelSearch(508, 552, 508, 552, 0xC8C9BB, $shade); 1-423-B8B6AA  2-428-C7C8BA  3-433-C8C9BB  4-438-C8C9BB        508-C8C9BB
    Select
	Case @error
		 Restart()
	  EndSelect
	         PixelSearch(508, 572, 438, 508, 0xC1C3B5, $shade); 1-423-B3AFA4  2-428-C3C1B4  3-433-C3C1B4  4-438-C3C1B4  5-443-C3C1B4  6-448-C6C4B7    458-C3C1B4   508-C1C3B5
    Select
	Case @error
		  Restart()
	   EndSelect
	   $coord = PixelSearch(2, 520, 801, 534, 0xFFFFFF, $shade)
         If Not @error Then
		 Send("{f}")
	  EndIf
	  $coord = PixelSearch(2, 529, 801, 534, 0xFFFFFF, $shade)
         If Not @error Then
		 Restart()
	  EndIf
	  $coord = PixelSearch(641, 641, 641, 641, 0xF4F3DF, $shade)
         If Not @error Then
           sleep(2333+RandSleep)
           Send("{SPACE}")
		   sleep(933+RandSleep)
		   RandClick1()
		EndIf
	 EndIf
WEnd

Я хочу добавить в него условие, чтобы при зажатии клавиши "g" больше определенного времени - выполнялось действие. Судя из примеров на форуме подходит это:
Код:
If  _IsPressed("47", $dll) Then
    $t = TimerInit()
    Do
      If TimerDiff($t) >= $limit Then
       Restart()
		ExitLoop
	 EndIf
  Until Not _IsPressed("47", $dll)
  EndIf


Когда соединяю их вместе, то сам этот блок работает, но изменяет работу основной части непонятным образом, может пока считает TimerDiff заблокировать передачу нажатия активному окну, когда ему помочь физическим нажатием на клавишу, то он тогда ее програмно зажимает и даже не реагирует после отсчета времени, также не реагирует на отжатие ее по команде из основного скрипта. В общем глюки основного скрипта, хотя сам нижний если только проверить срабатывает норм. Пробовал много вариантов, этот самый приближенный к рабочему. Может я что неправильно делаю.Соответствующие библиотеки подключаю.
Код:
#include <Misc.au3>
$dll = DllOpen("user32.dll")
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А что у тебя в Restart()?
Попробуй не Do Until, а While _IsPressed
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
В Restart() ничего такого, да и срабатывает он только после того как 8сек зажата "g", это видно, он у меня выводится сверху. Но на всякий случай вот он:
Код:
Func Restart()
   ToolTip("ПЕРЕЗАКИДЫВАЮ...", 370, 1)
	Send("{f}")
	sleep(300+RandSleep)
	Send("{g}")
	sleep(259+RandSleep)
	Send("{h}")
	sleep(412+RandSleep)
	Send("{SPACE}")
	sleep(412+RandSleep)
	Send("{g}")
	RandClick1()
	sleep(520+RandSleep)
	Send("{a}")
 EndFunc

Цикл по условию пробовал, если ExitLoop ставить после Until, то основной вообще не работает никогда, а если после Until ставить Else и потом ExitLoop, то работает как и счас, правда я весь этот кусок брал в цикл. Счас попробую после TimerInit(), хотя может и так пробовал, позапрошлая ночь этому была посвящена почти вся и уже может не все варианты и помню)) Спасибо вам, что участвуете в моем обучении.


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

Ведет себя точно также как и мой вариант, при чем, благодаря тому что токо что ошибся в первый раз (вместо While _IsPressed("47", $dll) поставил просто While _IsPressed) выяснил что точно мешает работе: это TimerDiff. Потому как при ошибке идеально работал основной и запускался TimerInit, ну и конечно не могло работать после просто While _IsPressed, а когда переделал норм, то опять начались глюки. Это проверяется оч легко, заброс в скрипте при этом режиме ловли (донка) всегда идет рандомно в некоторых пределах в одно место и анализируется не сдвигается ли точка, если да значит клюнуло и начинает тянуть. То есть после закидывания скриптом, я вручную перезакидываю в другое место и начинает тянуть как будто клюет. Когда подключаю этот дополнительный скрипт, то такого не происходит, значит TimerDiff или блокирует вообще нажатие или не передает его активному окну. И я уже писал в 1 посту, что если в это время сам на клаве хоть на сек нажму на нее, то она зажимается и уже ни доп скрипт, ни команды из основного скрипта не могут реализовать Restart(), она так и остается зажатой. Обьяснил немного принцип, чтоб легче было понять.
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
Выяснил с помощью программы для тестирования клавиатуры точно, что происходит пока считает TimerDiff, нажатия не передаются и не блокируются, потому что не срабатывает эта команда:
Код:
PixelSearch(438, 572, 438, 572, 0xC3C1B4, $shade); 1-423-B3AFA4  2-428-C3C1B4  3-433-C3C1B4  4-438-C3C1B4  5-443-C3C1B4  6-448-C6C4B7    458-C3C1B4   508-C1C3B5
    Select
    Case @error
         Send("{g up}")
         Send("{h down}")
        EndSelect
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
используй If Then Else а не Select Case в данной ситуации, для отладки прописывай еще и Else условия, во время отладки туда можно сунуть какой-нибудь месседжбокс или consloewrite, чтобы понять ситуацию
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
Я ToolTip использую. Не помогло, всё также. Может есть аналоги TimerInit и TimerDiff для контроля сколько нажата клавиша? Счас для эксперимента еще попробую PixelGetColor вместо PixelSearch, хотя нужна именно она.


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

Вот написал скриптик для проверки, попробуйте у себя, может у меня на компе что помогает жить. Только коорд и цвет свой подставьте. Там всё четко видно пока идет отсчет, цвет не анализируется.
Код:
#include <Misc.au3>
Opt("PixelCoordMode", 1)
Opt("MouseCoordMode", 1)
Global $paused
$dll = DllOpen("user32.dll")  
$limit = 8000
$t = TimerInit()
HotKeySet("{a}", "start")
HotKeySet("{s}", "pause")
HotKeySet("{ESC}", "Terminate") ;горячая клавиша - выход при нажатии ESC
Func Terminate()
    Exit 0
 EndFunc
Func start()
    ToolTip("РАБОТАЮ... ДЛЯ ПАУЗЫ--> S ", 1, 1)
    $paused = False
 EndFunc   ;==>start
Func pause()
    $paused = True
    ToolTip("ПАУЗА... ДЛЯ СТАРТА --> A ", 1, 1)
    While $paused = True
        Sleep(100)
    WEnd
 EndFunc   ;==>pause
 pause()
While 1
       Send("{h down}")
   If  _IsPressed("48", $dll) Then
    $t = TimerInit()
	ToolTip("СТАРТАНУЛ ОТСЧЕТ ", 170, 1)
    Do
      If TimerDiff($t) >= 8000 Then
		 ToolTip("ОТСЧЕТ ЗАКОНЧИЛСЯ", 170, 1)
       Send("{h up}")
		ExitLoop
	 EndIf
  Until Not _IsPressed("48", $dll)
  EndIf
	    PixelSearch(1359, 106, 1359, 106, 0xDBEAF9)
    Select
	Case Not @error
	     Beep()
		 Sleep(10)
		 ToolTip("УРА!!!  РАБОТАЕТ ))", 370, 1)
		EndSelect
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
vlv993
Во-первых, функция RandSleep() у вас не выполняется, т.к. везде пропущены скобки. Правильно так
Код:
sleep(1120+RandSleep())


Во-вторых, у вас везде обрабатывается только половина условия поиска пикселя. Например
Код:
PixelSearch($x4, $y4 - 2, $x4, $y4 - 2, 0xFFFFFF, $shade)
Select
  Case @error
    Send("{g down}")
EndSelect
Здесь обрабатывается условие, если пиксель НЕ найден. А если найден? Клавиша "G" нажата не будет. Следующий поиск пикселя также обрабатывает условие НЕ найден. А если найден? Тогда, при успешном предыдущем нажатии, "G" не будет отжата, а "H" не будет нажата. И эти половинки условий могут накладываться непредсказуемым образом. Поэтому, как правильно сказал Belfigor
используй If Then Else а не Select Case в данной ситуации
Код:
PixelSearch($x4, $y4 - 2, $x4, $y4 - 2, 0xFFFFFF, $shade)
If @error Then
  Send("{g down}")
Else
  ; и вот здесь - что делать, если пиксель найден
EndIf


В-третьих,
vlv993 [?]
Когда подключаю этот дополнительный скрипт
Вы хоть покажите, КАК вы его подключаете? В каком месте?

Ну, и в-четвёртых,
[?]
пока идет отсчет, цвет не анализируется
А почему он должен анализироваться, если он находится ВНЕ цикла отсчёта времени? У вас так составлен цикл, что клавиша будет отжата через 8 секунд, тогда и произойдёт выход из цикла и только после этого будет поиск пикселя.
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
Про RandSleep() согласен, просто у меня счас будет их 3 шт, еще RandSleep1() и RandSleep2(), скопировал немного не с того варианта. Отсальное же, как я и писал в 1 посту, работает идеально.

"Здесь обрабатывается условие, если пиксель НЕ найден. А если найден? Клавиша "G" нажата не будет."

Так и должно быть пока цвет на месте ничего не происходит, пропал цвет - клюнуло - тащим.


"Следующий поиск пикселя также обрабатывает условие НЕ найден. А если найден? Тогда, при успешном предыдущем нажатии, "G" не будет отжата, а "H" не будет нажата. И эти половинки условий могут накладываться непредсказуемым образом."

Здесь как раз всё норм работает
Код:
PixelSearch(438, 572, 438, 572, 0xC3C1B4, $shade); 1-423-B3AFA4  2-428-C3C1B4  3-433-C3C1B4  4-438-C3C1B4  5-443-C3C1B4  6-448-C6C4B7    458-C3C1B4   508-C1C3B5
    Select
    Case @error
         Send("{g up}")
         Send("{h down}")
        EndSelect
             PixelSearch(433, 552, 433, 552, 0xC8C9BB, $shade); 1-423-B8B6AA  2-428-C7C8BA  3-433-C8C9BB  4-438-C8C9BB        508-C8C9BB
    Select
    Case @error
         Send("{h up}")
         Send("{g down}")
      EndSelect

Они идут в паре, это грубо говоря индикаторы перегрузки, если нет цвета на одном отжимается одна клавиша и зажимается другая, и тоже самое с другим индикатором. Делал на отсутствие цвета, потому что если бы на присутствие другого цвета проверял, то там 12 градаций цвета на 24 пикселя по высоте, чуть маленький сдвиг и уже глюки. Еще раз повторюсь верхняя часть уже вылизана по алгоритму ипо работе в реальных условиях.

"Вы хоть покажите, КАК вы его подключаете? В каком месте?"

Как я его тоько не подключал, и в начале и в конце, и по условию весь его в цикл заключал и только в цикл ту часть что после TimerInit.

"А почему он должен анализироваться, если он находится ВНЕ цикла отсчёта времени? У вас так составлен цикл, что клавиша будет отжата через 8 секунд, тогда и произойдёт выход из цикла и только после этого будет поиск пикселя."

Это я уже и сам понимаю, только никак не могу сообразить, как сделать чтоб и было слежение по времени за клавишей когда она нажата, и чтоб по команде от PixelSearch она отжималась когда идет это слежение. Мне что-то уже кажется что это невозможно ((
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
vlv993 [?]
чтоб и было слежение по времени за клавишей когда она нажата, и чтоб по команде от PixelSearch она отжималась когда идет это слежение
Код:
While 1
  Send("{h down}")
  If _IsPressed("48", $dll) Then
    $t = TimerInit()
    ToolTip("СТАРТАНУЛ ОТСЧЕТ ", 170, 1)
    Do
      PixelSearch(1359, 106, 1359, 106, 0xDBEAF9)
      Select
        Case Not @error
          Beep()
          ToolTip("УРА!!!  РАБОТАЕТ ))", 370, 1)
          Sleep(1000)
          Send("{h up}")
      EndSelect
      If TimerDiff($t) >= 8000 Then
        ToolTip("ОТСЧЕТ ЗАКОНЧИЛСЯ", 170, 1)
        ExitLoop
      EndIf
    Until Not _IsPressed("48", $dll)
  EndIf
WEnd
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
Спасибо за совет, попробую слепить это всё дело, таких слежений за кнопками должно быть 2 и по 4 PixelSearch на каждое. Идея, а не влепить ли мне между этим
Код:
While 1
  Send("{h down}")
  If _IsPressed("48", $dll) Then
    $t = TimerInit()
    ToolTip("СТАРТАНУЛ ОТСЧЕТ ", 170, 1)
    Do


и этим

Код:
If TimerDiff($t) >= 8000 Then
        ToolTip("ОТСЧЕТ ЗАКОНЧИЛСЯ", 170, 1)
        ExitLoop
      EndIf
    Until Not _IsPressed("48", $dll)
  EndIf
WEnd


весь участок где есть эти PixelSearch ? Будет работать ?
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
vlv993 [?]
Будет работать ?
С точки зрения человека, не видевшего эту игру, ваш код - просто набор условий. С точки зрения логики - непредсказуемо работающий набор условий. Какова вероятность, что этот набор условий будет работать в цикле? 50% - либо будет, либо нет. И в любом случае, вы придёте к тому, с чего начали эту тему: к работе кода
непонятным образом
 
Автор
V

vlv993

Новичок
Сообщения
20
Репутация
0
Еще раз большое спс за помощь, сделал общий цикл в котором часть ф-ий из основного моего, дальше добавил 2 слежения за 2 кнопками и в каждое еще циклом по 4 PixelSearch от индикаторов и по 3 PixelSearch когда рыба уже у берега. Всё работает прекрасно. Очень помог ваш пример.
 
Верх