Author Topic: временный цикл  (Read 10267 times)

0 Members and 3 Guests are viewing this topic.

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
временный цикл
« on: January 01, 2015, 08:57:58 PM »
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PIXEL_IN(37,667, 272,788, 255)
      LCLICK($_return1, $_return2)
      $check = 1
      WAITMS(100)
   ELSE
   END_IF
   END_CYC

Как наложить временные рамки на этот цикл, что бы если он так и не найдёт красный пиксель, то вышел из цикла и пошел дальше по сценарию?  Заранее БЛАГОДАРЕН!   

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: временный цикл
« Reply #1 on: January 01, 2015, 09:18:41 PM »
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   IF_PIXEL_IN(37,667, 272,788, 255)
      LCLICK($_return1, $_return2)
      $check = 1
      WAITMS(100)
   ELSE
   END_IF
   END_CYC

Как наложить временные рамки на этот цикл, что бы если он так и не найдёт красный пиксель, то вышел из цикла и пошел дальше по сценарию?  Заранее БЛАГОДАРЕН!   

Code: (clickermann) [Select]
$time = $_time_t + 10  // 10 секунд
WHILE($time > $_time_t)
   GETSCREEN
   IF_PIXEL_IN(37,667, 272,788, 255)
      LCLICK($_return1, $_return2)
      $time = 0
   END_IF
   WAITMS(100)
END_CYC


kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #2 on: January 01, 2015, 09:23:43 PM »
Спасибо!

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #3 on: January 02, 2015, 03:09:35 AM »
Помогите теперь в этом коде разобрать что тут не так? Ниже в коде есть комментарии где и возникли сложности. Ещё не могу понять по чему делает клик по координатам из IF_PIXEL_IN(1275,161, 1275,161, 10150560).О коде: первый поток должен работать беспрестанно, пока основной поток не сообщит об отсутствие пикселя на экране и не отключит его, после чего выполнит действия после цикла и снова запустит 1-ый поток.

Code: (clickermann) [Select]
// первый поток
thread(t1)
   $rnd_x = RND(37,272)
   $rnd_y = RND(667,788)
   LCLICK($rnd_x,$rnd_y)
   WAITMS(100)
   MOVE(565,518)
   WAITMS(100)
   $time = $_time_t + 10  // 10 секунд
   WHILE($time > $_time_t)
      GETSCREEN
      IF_PIXEL_IN(37,667, 272,788, 255)
         $time = 0
         LCLICK($_return1, $_return2)
         MOVE(565,518)
         WAITMS(100)
      ELSE
      END_IF
      WAITMS(100)
   END_CYC
   WAITMS(100)
   $time = $_time_t + 5  // 5 секунд
   WHILE($time > $_time_t)
      GETSCREEN
      IF_PIXEL_IN(0,86, 1437,855, 10010271)
         LCLICK($_return1, $_return2)
         WAITMS(100)
         LCLICK($_return1, $_return2)
         WAITMS(300)
         KEYPRESS(#ctrl)
         WAITMS(4500)
         GETSCREEN
         IF_PIXEL_IN(0,86, 1437,855, 5265980)
            $time = 0
            LCLICK($_return1, $_return2)
            WAITMS(100)
            LCLICK($_return1, $_return2)
            WAITMS(300)
            KEYPRESS(#ctrl)
            WAITMS(15000)
         ELSE
         END_IF
      END_IF
      WAITMS(100)
   END_CYC
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PIXEL_IN(0,86, 1437,855, 10010271)
         LCLICK($_return1, $_return2)
         WAITMS(100)
         LCLICK($_return1, $_return2)
         WAITMS(300)
         KEYPRESS(#ctrl)
         WAITMS(4500)
      ELSE
         GETSCREEN
         IF_PIXEL_IN(0,86, 1437,855, 5265980)
            LCLICK($_return1, $_return2)
            WAITMS(100)
            LCLICK($_return1, $_return2)
            WAITMS(300)
            KEYPRESS(#ctrl)
            WAITMS(15000)
         ELSE
            $check = 1
         END_IF
      END_IF
   END_CYC
end_thread

//-----------------------------------------
// Основной поток
$var = 0
WHILE($var = 0)
   IF_PIXEL_IN(1275,161, 1275,161, 10150560) // тут должен постоянно смотреть на месте пиксель или нет, если нету то идёт дальше
   ELSE
      $var = 1
   END_IF
   WAITMS(100)
END_CYC
WAITMS(100)
thread(t1, 0) // тут если не нашел пиксель должен остановить 1-ый поток
   WAITMS(100)
   LCLICK(152,668)
   WAITMS(100)
   KEYPRESS(#c)
   WAITMS(100)
   KEYPRESS(#tab)
   WAITMS(1000)
   LCLICK(551,711)
   WAIT(300)
   LCLICK(817,448)  // 3814400
   WAITMS(1000)
   LCLICK(803,528)  // 3878950
   WAITMS(1000)
   LCLICK(741,530)  // 12631482
   WAITMS(1000)
   LCLICK(662,533)  // 4997689
   WAITMS(1000)
   LCLICK(568,533)  // 5590083
   WAITMS(1000)
   LCLICK(489,528)  // 3878950
   WAITMS(1000)
   LCLICK(456,370)  // 13541704
   WAITMS(1000)
   KEYPRESS(#c)
   WAITMS(100)
   LCLICK(663,715)
   WAITMS(100)
   KEYPRESS(#tab)
   WAITMS(1000)
   LCLICK(411,113)  // 16316403
   WAITMS(1000)
   LCLICK(267,458)  // 52479
   WAITMS(1000)
   LCLICK(181,540)  // 14606046
   WAITMS(1000)
   LCLICK(16,358)  // 12096074
   WAITMS(10000)

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: временный цикл
« Reply #4 on: January 02, 2015, 08:06:43 AM »
Code: (clickermann) [Select]
thread(t1,0) // поток изначально не работает
///
end_thread

thread(t1,1) // поток изначально работает
///
end_thread

SETTHREAD (t1, 0) // команда останавливает поток (пауза) к сожалению команд перезапуска пока нет
SETTHREAD (t1, 1) // команда возобновляет поток

Вот исправленный оптимизированный код
Code: (clickermann) [Select]
// первый поток
thread(t1)
   $rnd_x = RND(37,272)
   $rnd_y = RND(667,788)
   LCLICK($rnd_x,$rnd_y)
   WAITMS(100)
   MOVE(565,518)
   WAITMS(100)
   $time = $_time_t + 10  // 10 секунд
   WHILE($time > $_time_t)
      GETSCREEN
      IF_PIXEL_IN(37,667, 272,788, 255)
         $time = 0
         LCLICK($_return1, $_return2)
         MOVE(565,518)
         WAITMS(100)
      ELSE
         WAITMS(100)
      END_IF
   END_CYC
   WAITMS(100)
   $time = $_time_t + 5  // 5 секунд
   WHILE($time > $_time_t)
      GETSCREEN
      IF_PIXEL_IN(0,86, 1437,855, 10010271)
         LCLICK($_return1, $_return2)
         WAITMS(100)
         LCLICK($_return1, $_return2)
         WAITMS(300)
         KEYPRESS(#ctrl)
         WAITMS(4500)
         GETSCREEN
         IF_PIXEL_IN(0,86, 1437,855, 5265980)
            $time = 0
            LCLICK($_return1, $_return2)
            WAITMS(100)
            LCLICK($_return1, $_return2)
            WAITMS(300)
            KEYPRESS(#ctrl)
            WAIT(15)
         END_IF
      END_IF
      WAITMS(100)
   END_CYC
   $check = 0
   WHILE($check = 0)
      GETSCREEN
      IF_PIXEL_IN(0,86, 1437,855, 10010271)
         LCLICK($_return1, $_return2)
         WAITMS(100)
         LCLICK($_return1, $_return2)
         WAITMS(300)
         KEYPRESS(#ctrl)
         WAITMS(4500)
      ELSE
         IF_PIXEL_IN(0,86, 1437,855, 5265980)
            LCLICK($_return1, $_return2)
            WAITMS(100)
            LCLICK($_return1, $_return2)
            WAITMS(300)
            KEYPRESS(#ctrl)
            WAIT(15)
         ELSE
            $check = 1
         END_IF
      END_IF
   END_CYC
end_thread

//-----------------------------------------
// Основной поток
$var = 0
WHILE($var = 0)
   GETSCREEN
   IF_PIXEL_IN(1275,161, 1275,161, 10150560) // тут должен постоянно смотреть на месте пиксель или нет, если нету то идёт дальше
      WAITMS(100)
   ELSE
      $var = 1
   END_IF
END_CYC
WAITMS(100)

SETTHREAD (t1, 0) // тут если не нашел пиксель должен остановить 1-ый поток

WAITMS(100)
LCLICK(152,668)
WAITMS(100)
KEYPRESS(#c)
WAITMS(100)
KEYPRESS(#tab)
WAITMS(1000)
LCLICK(551,711)
WAIT(300)
LCLICK(817,448)  // 3814400
WAITMS(1000)
LCLICK(803,528)  // 3878950
WAITMS(1000)
LCLICK(741,530)  // 12631482
WAITMS(1000)
LCLICK(662,533)  // 4997689
WAITMS(1000)
LCLICK(568,533)  // 5590083
WAITMS(1000)
LCLICK(489,528)  // 3878950
WAITMS(1000)
LCLICK(456,370)  // 13541704
WAITMS(1000)
KEYPRESS(#c)
WAITMS(100)
LCLICK(663,715)
WAITMS(100)
KEYPRESS(#tab)
WAITMS(1000)
LCLICK(411,113)  // 16316403
WAITMS(1000)
LCLICK(267,458)  // 52479
WAITMS(1000)
LCLICK(181,540)  // 14606046
WAITMS(1000)
LCLICK(16,358)  // 12096074
WAITMS(10000)
« Last Edit: January 02, 2015, 08:12:08 AM by Oraven »

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #5 on: January 02, 2015, 08:40:37 AM »
Не могу проверить т.к. тот клик по координатам из IF_PIXEL_IN(1287,168, 1287,168, 9363348) все портит ( это шкала здоровья и при тыки на неё она становиться цифровой) как исправить?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: временный цикл
« Reply #6 on: January 02, 2015, 11:03:55 AM »
Где ты там клик увидел?

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #7 on: January 02, 2015, 11:36:07 AM »
В этом то и проблема, в коде его нету, а на дели он тыкает куды не надо.

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #8 on: January 02, 2015, 11:38:04 AM »
У меня предположение что он в эти переменные $_return1, $_return2 засовывает координаты тех пикселей и где то идёт клик по ним. Может их  обнулить доп. кодом?
« Last Edit: January 02, 2015, 12:03:20 PM by kirill »

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #9 on: January 02, 2015, 12:04:59 PM »
Клик идёт предположительно при выполнение этой части кода.
Code: (clickermann) [Select]
$time = $_time_t + 5  // 5 ñåêóíä
   WHILE($time > $_time_t)
      GETSCREEN
      IF_PIXEL_IN(0,86, 1437,855, 10010271)
         LCLICK($_return1, $_return2)
         WAITMS(100)
         LCLICK($_return1, $_return2)
         WAITMS(300)
         KEYPRESS(#ctrl)
         WAITMS(4500)
         GETSCREEN
         IF_PIXEL_IN(0,86, 1437,855, 5265980)
            $time = 0
            LCLICK($_return1, $_return2)
            WAITMS(100)
            LCLICK($_return1, $_return2)
            WAITMS(300)
            KEYPRESS(#ctrl)
            WAIT(15)
         END_IF
      END_IF

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: временный цикл
« Reply #10 on: January 02, 2015, 12:55:07 PM »
Системные переменные обнулить нельзя. Вместо этого лучше использовать более подходящую для анализа пиксела по точным координатам функцию PXL. В этом случае $_return1, $_return2 не затрагиваются.

Code: (clickermann) [Select]
// Основной поток
$var = 0
WHILE($var = 0)
   GETSCREEN
   IF(PXL(1275,161) = 10150560) // тут должен постоянно смотреть на месте пиксель или нет, если нету то идёт дальше
      WAITMS(100)
   ELSE
      $var = 1
   END_IF
END_CYC
WAITMS(100)

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #11 on: January 02, 2015, 01:16:31 PM »
Системные переменные обнулить нельзя. Вместо этого лучше использовать более подходящую для анализа пиксела по точным координатам функцию PXL. В этом случае $_return1, $_return2 не затрагиваются.

Code: (clickermann) [Select]
// Основной поток
$var = 0
WHILE($var = 0)
   GETSCREEN
   IF(PXL(1275,161) = 10150560) // тут должен постоянно смотреть на месте пиксель или нет, если нету то идёт дальше
      WAITMS(100)
   ELSE
      $var = 1
   END_IF
END_CYC
WAITMS(100)
Спасибо большое теперь все хорошо работает, буду пробовать дополнять))

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: временный цикл
« Reply #12 on: January 02, 2015, 05:39:52 PM »
Если используются потоки с использованием $_return1, $_return2 то тянуть резину нельзя.
Как только нашли изображение сразу переприсваиваем переменные своим
$X = $_return1
$Y = $_return2
Потом уже все ожидания-клики. А так конечно, то 100 мс ждём, то 300. Естественно другой поток их может перезатереть.

Но это проблема, её нужно решать. Всё равно наступят моменты когда выполнение анализа совпадёт.
Или $_return1, $_return2 должны быть локальными в каждом потоке (что лучше). Или при использовании функций поиска в потоке эти переменные должны иметь другие имена
$_return1_ИМЯПОТОКА, $_return2_ИМЯПОТОКА.


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: временный цикл
« Reply #13 on: January 02, 2015, 06:06:38 PM »
Нет пусть уж обычные переменные будут локальными, нужно только придумать глобальные для обмена данными между потоками.

kirill

  • Освоившийся
  • **
  • Posts: 39
    • View Profile
Re: временный цикл
« Reply #14 on: January 03, 2015, 03:48:56 AM »
Помогите исправить ошибки и оптимизировать код
Code: (clickermann) [Select]
//-----------------------------------------
// первый поток

thread(t1)
SetThread(t5,0)
WAITMS(100)
SetThread(t1,1)
WAITMS(100)
KEYUP(#ctrl)
$rnd_x = RND(37,272)
$rnd_y = RND(667,788)
LCLICK($rnd_x,$rnd_y)
WAITMS(100)
MOVE(565,518)
WAITMS(100)
SetThread(t2,1)
WAITMS(100)
end_thread

//-----------------------------------------
// второй поток

thread(t2,0)
SetThread(t1,0)
$time = $_time_t + 10  // 10 секунд
WHILE($time > $_time_t)
GETSCREEN
IF_PIXEL_IN(37,667, 272,788, 255)
$time = 0
   LCLICK($_return1, $_return2)
   MOVE(565,518)
   WAITMS(100)
ELSE
   SetThread(t1,1)
   WAITMS(100)
ELSE
END_IF
WAITMS(100)
END_CYC
WAITMS(100)
SetThread(t3,1)
WAITMS(100)
end_thread

//-----------------------------------------
// третий поток

thread(t3,0)
SetThread(t2,0)
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PIXEL_IN(0,86, 1437,855, 5337430)
$check = 1
LCLICK($_return1, $_return2)
WAITMS(100)
LCLICK($_return1, $_return2)
ELSE
SetThread(t5,1)   // тут должен если пиксель найден вкл. пятый поток
WAITMS(100
ELSE
END_IF
WAITMS(100)
END_CYC
SetThread(t4,1)         // тут если пиксель не найден должен проигнорировать вкл. пятого потока и вкл. четвёртый
WAITMS(100)
end_thread

//-----------------------------------------
// четвёртый поток

thread(t4,0)
SetThread(t3,0)
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PIXEL_IN(0,86, 1437,855, 5265980)
$check = 1
LCLICK($_return1, $_return2)
WAITMS(100)
LCLICK($_return1, $_return2)
ELSE
SetThread(t5,1)   // тут тоже что и в четвертом потоке
WAITMS(100
ELSE
END_IF
WAITMS(100)
END_CYC
SetThread(t1,1)
WAITMS(100)
end_thread

//-----------------------------------------
// пятый поток

thread(t5,0)
SetThread(t3,0)
WAITMS(100)
SetThread(t4,0)
$check = 0
WHILE($check = 0)
GETSCREEN
IF_PIXEL_IN(0,86, 1437,855, 1911161, 728280, 2237817)
KEYDOWN(#ctrl)
ELSE
KEYUP(#ctrl)
WAITMS(100)
SetThread(t1,1)
WAITMS(100)
ELSE
$check = 1
END_IF
WAITMS(100)
END_CYC
end_thread
« Last Edit: January 03, 2015, 03:57:37 AM by kirill »