Author Topic: Помогите разобраться в чем иногда трабл  (Read 2212 times)

0 Members and 2 Guests are viewing this topic.

Kibes

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
Задача кликера такая, нужно при одном условии, найти другое условие, потом третье, если три условия совпадают, то мышкой кликает на последний объект. Строю программу таким образом:


Code: [Select]
Здесь скрипт реалистичного движения мышкой (пробовал его отключать, проблема не в нем.)
GETSCREEN
colormode(7)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic1.bmp", 75)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic2.bmp", 75)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic3.bmp", 75)
$xms=$_return1 + RND(-5,5)
$yms=$_return2 + RND(-5,5)
m_move($xms, $yms)
lclick($xms, $yms)
END_IF
END_IF
END_IF
В 90% случаев программа отрабатывает правильно, и дальше идет по циклу как нужно. Но бывает, как что-то находит и координата Х ошибочно идет нулевой. То есть в логах пишет координату У правильную, а вот Х с нулевым значением. И это постоянно проблема координаты Х. С У таких проблем ниразу не было. Пробовал другую версию кликера, проблема остается. Возможно что-то мешает в коде. Отследить закономерность, когда это случается - не могу. Может весь день отработать без проблем, а на следующий - снова такая беда.
Возможно это потому что поралельно, другими потоками, выполняются другие действия, но там сугубо отслежка идет, контроль того, что делает основная программа, и если что не так - то что в других потоках или запускает цикл заново, или сигнализирует мне о состоянии чего-то там.
Пример:
Code: [Select]
thread(t1)
GETSCREEN
colormode(7)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic4.bmp", 75)
beep(110,170)
END_IF
end_thread
И что самое интересное, делаю скрин экрана командой SCREENSHOT перед тем как двигать мышку и перед тем как жать на мышку и тут же записываю в лог координаты, которые находит кликер! То цель только по координате Х не совпадает. Сама цель статическая, она никуда не двигается, почему кликер иногда путает именно координату Х - не понятно. Менял уже и буквенные переменные координат Х, У ничего не меняется.

Есть массив типа: scanpicture, где тоже кликер кликает на найденный массив - там отрабатывается всегда правильно! Сбоев в последнем никогда не было!
« Last Edit: January 21, 2019, 01:29:51 AM by Kibes »

Shada

  • Освоившийся
  • **
  • Posts: 24
    • View Profile
Системные переменные $_return1 и $_return2 видны во всех потоках, они глобальные. В несинхронизированных потоках IF_PICTURE_IN() из одного потока перезаписывает значения этих переменных, которые предназначались для другого потока.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Дабы избежать таких ошибок с общими системными переменными в потоках, можно в момент поиска картинок-пикселей в основном потоке,  ставить на паузу-стоп дополнительные потоки.

Shada

  • Освоившийся
  • **
  • Posts: 24
    • View Profile
В этом случае дополнительный поток похоже выполняет роль управляющего потока. Целиком ставить на пузу его наверно не следует. Разве только переключать флаг управляющий выполнением IF_PICTURE_IN(). Но всё это пока только догадки.

Kibes

  • Освоившийся
  • **
  • Posts: 23
    • View Profile
В том то и дело, что несколько паралельных потоков отслеживают действия основного кода! В случае изменения основного условия, дополнительного условия они мне сообщают об ситуации на экране. В главный код засунуть эти условия не могу, дольше выполняется сама программа, плюс очень большой получается "блок схема что выполнил и что дальше выполнять" паралельно отслеживать удобней и оперативно принимать решения удобней.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Code: [Select]
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic1.bmp", 75)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic2.bmp", 75)
IF_PICTURE_IN (0,0, $_xmax, $_ymax, "pic3.bmp", 75)
Точно игнорируемый цвет 75?
Если да или просто опечатка, то для ухода от $_return1 и $_return2 переделай IF_PICTURE_IN на SCANPICTURE как то так
Code: (clickermann) [Select]
UNDEFINE($scan1)
GETSCREEN
colormode(7)
SCANPICTURE($scan1, 0,0, $_xmax,$_ymax, "pic1.bmp", -1, 75)
IF(ARRSIZE($scan1) > 0)
    UNDEFINE($scan1)
    SCANPICTURE($scan1, 0,0, $_xmax,$_ymax, "pic2.bmp", -1, 75)
    IF(ARRSIZE($scan1) > 0)
        UNDEFINE($scan1)
        SCANPICTURE($scan1, 0,0, $_xmax,$_ymax, "pic3.bmp", -1, 75)
        IF(ARRSIZE($scan1) > 0)
            $xms = $scan1[0] + RND(-5,5)
            $yms = $scan1[1] + RND(-5,5)
            m_move($xms, $yms)
            lclick($xms, $yms)
        END_IF
    END_IF
END_IF