Author Topic: про Thread  (Read 2941 times)

0 Members and 1 Guest are viewing this topic.

sibas

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
про Thread
« on: March 21, 2015, 09:03:28 AM »
Снова Здравствуйте! У меня возник такой вопрос - объясняю по рисунку ниже: Зеленые кружочки с определенной скоростью движутся вправо до конца, на пути у них белый квадрат при попадании на который срабатывает if_pixel_in и через 3 секунды должна нажаться  кнопка Q, потому-что чтобы кружочку добраться от белого до черного квадрата нужно 3 секунды, и thread еще не закончил свою работу но на белый квадрат наступил еще один кружочек и получается что он из за этого не нажмётся. Вопрос в этом и заключается, как мне это сделать? Есть догадки засунуть thread в thread но тут я путаюсь или засунуть getscreen в отдельный thread(если так можно) будут ли последующие потоки с if_pixel_in использовать обновленный getscreen из другого потока? Или же подскажите свою версию как это реализовать
Code: [Select]
WHILE(1)
GETSCREEN(617,670, 802,682)
SetThread (thr_q, 1)
END_CYC

THREAD(thr_q,0)
IF_PIXEL_IN(618,671, 647,681, 566784)
wait(3)                                   // 3 sec
KEYDOWN(#q)
waitms(10)
KEYUP(#q)

SetThread (thr_q, 0)
END_THREAD
« Last Edit: March 21, 2015, 09:41:04 AM by sibas »

NStra

  • Освоившийся
  • **
  • Posts: 45
  • Подпись под аватаром.
    • View Profile
Re: про Thread
« Reply #1 on: March 21, 2015, 10:02:07 AM »
Попробуй...
Code: [Select]
WHILE(1)
GETSCREEN(617,670, 802,682)
IF_PIXEL_IN(618,671, 647,681, 566784)
        Switch($_time_s)
        case(60)
        ARRPUSH ($timen,3)
        case(59)
        ARRPUSH ($timen,2)
        case(58)
        ARRPUSH ($timen,1)
        case(57)
        ARRPUSH ($timen,0)
        default
        ARRPUSH ($timen,$_time_s+3)
        End_switch
        wait(1)
        End_if
        $timet=$timen[0]
        IF($_time_s=$timet)
        // Тут нужно извлечь 1 элемент из массива...сделай сам.
        KEYPRESS(#Q)
        End_if
END_CYC
« Last Edit: March 22, 2015, 06:40:26 AM by NStra »
Тут должна быть подпись...

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: про Thread
« Reply #2 on: March 21, 2015, 03:55:26 PM »
И не хватает завершающего END_IF
Code: (clickermann) [Select]
WHILE(1)
   GETSCREEN(617,670, 802,682)
   SetThread (thr_q, 1)
   WAITMS(5)
END_CYC

THREAD(thr_q,0)
   IF_PIXEL_IN(618,671, 647,681, 566784)
      waitms(3000)                                   // 3 sec
      KEYDOWN(#q)
      waitms(10)
      KEYUP(#q)
   END_IF
   
   SetThread (thr_q, 0)
END_THREAD

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: про Thread
« Reply #3 on: March 21, 2015, 08:16:22 PM »
Снова Здравствуйте! У меня возник такой вопрос - объясняю по рисунку ниже: Зеленые кружочки с определенной скоростью движутся вправо до конца, на пути у них белый квадрат при попадании на который срабатывает if_pixel_in и через 3 секунды должна нажаться  кнопка Q, потому-что чтобы кружочку добраться от белого до черного квадрата нужно 3 секунды, и thread еще не закончил свою работу но на белый квадрат наступил еще один кружочек и получается что он из за этого не нажмётся. Вопрос в этом и заключается, как мне это сделать? Есть догадки засунуть thread в thread но тут я путаюсь или засунуть getscreen в отдельный thread(если так можно) будут ли последующие потоки с if_pixel_in использовать обновленный getscreen из другого потока? Или же подскажите свою версию как это реализовать

Создавай очередь из шаров. Попал шар в зону определения - запиши в массив время прихода. Попал новый - его время в очередь.
А другой цикл проверяет очереди и если одно из значений вышло жмакаем.
Только мне кажется у них скорость движения может измениться. Как подстраивать будешь?
И почему 3 сек? Сделай белую область перед самой красной. Там нажатия вроде уже засчитывают.

Ида, а как ты собираешься удерживать длинные... шары? :)


sibas

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Re: про Thread
« Reply #4 on: March 22, 2015, 07:02:29 AM »
Создавай очередь из шаров. Попал шар в зону определения - запиши в массив время прихода. Попал новый - его время в очередь.
А другой цикл проверяет очереди и если одно из значений вышло жмакаем.
Только мне кажется у них скорость движения может измениться. Как подстраивать будешь?
И почему 3 сек? Сделай белую область перед самой красной. Там нажатия вроде уже засчитывают.
Ида, а как ты собираешься удерживать длинные... шары? :)
Я в массивах вообще ноль( если вам не трудно натолкните меня. Скорость шаров не меняется, 3 секунды потому что если дальше ловить if_pixel_in, там на заднем фоне много цветов и этих и других, поэтому минимум нужно на таком расстоянии
« Last Edit: March 22, 2015, 07:10:33 AM by sibas »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: про Thread
« Reply #5 on: March 22, 2015, 12:13:11 PM »
конечно можно и с массивами, но мне почемуто первое что пришло в голову, это разделить на потоки нажатия кнопок и проверять какой из них свободен.

Code: (clickermann) [Select]
WHILE(1)
   GETSCREEN
   IF_PIXEL_IN(618,671, 647,681, 566784)     
      IF($s1=0)
         SetThread (s1, 1)
      ELSE
         IF($s2=0)
            SetThread (s2, 1)
         ELSE
            IF($s3=0)
               SetThread (s3, 1)
            ELSE
               print("все потоки заняты, нужно еще")
            END_IF
         END_IF
      END_IF                             
   END_IF
   waitms(10)
END_CYC
///////////////////////////////////////
THREAD(s1, 0)
   $s1=1
   wait(3)
   KEYDOWN(#q)
   waitms(10)
   KEYUP(#q)
   $s1=0
   SetThread (s1, 0)
END_THREAD

THREAD(s2, 0)
   $s2=1
   wait(3)
   KEYDOWN(#q)
   waitms(10)
   KEYUP(#q)
   $s2=0
   SetThread (s2, 0)
END_THREAD

THREAD(s3, 0)
   $s3=1
   wait(3)
   KEYDOWN(#q)
   waitms(10)
   KEYUP(#q)
   $s3=0
   SetThread (s3, 0)
END_THREAD


если твоих шаров будет тьма тмущяя и их(потоков) небудет хватать, нестесняйся, добовляй еще.