Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: bpa on February 16, 2015, 09:17:39 AM
-
помогите с скриптом. Я написал скрипт под игру. Правельно ли? И иногда в промежутках выскакивают окна где нужно нажимать на кнопки подтверждения. Вот их я и не знаю как победить
GETSCREEN
WHILE(PXL (1529,425) ! 7381699)
WAITMS (1000)
GETSCREEN
END_CYC
LCLICK(1524,428)
GETSCREEN
WHILE(PXL (1487,756) ! 10982251)
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1487,756)
GETSCREEN
WHILE(PXL (1165,184) ! 12636637)
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1165,184)
WAIT(1)
LCLICK(1504,758)
GETSCREEN
WHILE(PXL (1504,749) ! 10455909)
WAITMS (100)
GETSCREEN
END_CYC
WAIT(1)
LCLICK(1533,749)
WAIT(1)
LCLICK(1533,749)
$time = $_time_t + 2
GETSCREEN
WHILE((PXL (1394,557) ! 8612425) & ($time > $_time_t))
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1394,557)
WAITMS(2000)
LCLICK (1411,749)
GETSCREEN
WHILE(PXL (1323,592) ! 13095135)
WAITMS (1200)
GETSCREEN
END_CYC
DBLCLICK(1372,681)
-
Используй потоки, один поток выполняет твой скрипт а другой параллельно следит за окнами.
Если второй поток найдет окно то нужно поставить на паузу первый поток вот такой командой
SETTHREAD (main, 0)
убрать окно и продолжить выполнение первого потока командой
SETTHREAD (main, 1)
THREAD(main, 1) // главный скрипт
GETSCREEN
WHILE(PXL (1529,425) ! 7381699)
WAITMS (1000)
GETSCREEN
END_CYC
LCLICK(1524,428)
GETSCREEN
WHILE(PXL (1487,756) ! 10982251)
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1487,756)
GETSCREEN
WHILE(PXL (1165,184) ! 12636637)
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1165,184)
WAIT(1)
LCLICK(1504,758)
GETSCREEN
WHILE(PXL (1504,749) ! 10455909)
WAITMS (100)
GETSCREEN
END_CYC
WAIT(1)
LCLICK(1533,749)
WAIT(1)
LCLICK(1533,749)
$time = $_time_t + 2
GETSCREEN
WHILE((PXL (1394,557) ! 8612425) & ($time > $_time_t))
WAITMS (100)
GETSCREEN
END_CYC
LCLICK(1394,557)
WAITMS(2000)
LCLICK (1411,749)
GETSCREEN
WHILE(PXL (1323,592) ! 13095135)
WAITMS (1200)
GETSCREEN
END_CYC
DBLCLICK(1372,681)
END_THREAD
THREAD(pomexi, 1) // проверка на всплывающие окна
// здесь использовать функции поиска картинок или пикселов или другие, чтобы определить выскочившее окно и убрать его
END_THREAD
WAIT(1)
-
спасибо. а три потока потянет?
-
Можно напишу в Вашей теме, просто меня тоже этот вопрос интересовал.
если я использую подпрограммы, то все это будет выглядеть так:
SUB (sub_1)
...
END_SUB
SUB (sub_2)
...
END_SUB
SUB (sub_3)
...
END_SUB
SUB (реклама)
...
END_SUB
THREAD(main, 1) // главный скрипт
sub_1()
sub_2()
sub_3()
sub_1()
END_THREAD
THREAD(pomexi, 1) // проверка на всплывающие окна
реклама()
END_THREAD
-
спасибо. а три потока потянет?
Сколько угодно потянет.
Можно напишу в Вашей теме, просто меня тоже этот вопрос интересовал.
если я использую подпрограммы, то все это будет выглядеть так:
Неверно, подпрограммы должны описываться в том же потоке.
THREAD(main, 1) // главный скрипт
SUB (sub_1)
...
END_SUB
SUB (sub_2)
...
END_SUB
SUB (sub_3)
...
END_SUB
sub_1()
sub_2()
sub_3()
sub_1()
END_THREAD
THREAD(pomexi, 1) // проверка на всплывающие окна
SUB (реклама)
...
END_SUB
реклама()
END_THREAD
И подпрограммы целесообразно использовать только при многочисленном повторении куска кода.
-
И подпрограммы целесообразно использовать только при многочисленном повторении куска кода.
Это относится только при использовании потоков или вообще?
Я думал, что с подпрограммами скрипт будет более гибким, можно включать и отключать оперативно часть подпрограмм.
А чем грозит, если подпрограмм будет много?
-
А чем грозит, если подпрограмм будет много?
Ничем.
Я думал, что с подпрограммами скрипт будет более гибким, можно включать и отключать оперативно часть подпрограмм.
Представь что ты читаешь книгу с кучей ссылок. Вместо того чтобы сразу прочитать текст ты вынужден метаться в конец книги за разъяснениями. Кликеру все равно а вот пользователю сложнее разбираться в коде.
Если хочешь отключить часть кода. просто заключи его в условие, а в начале кода напиши переменные для настройки
$cod_1 = 1
$cod_2 = 0
$cod_3 = 1
IF($cod_1 = 1)
// body
END_IF
IF($cod_2 = 1)
// body
END_IF
IF($cod_3 = 1)
// body
END_IF
Использование подпрограмм накладывает некоторые ограничения, из них не рекомендуется выпрыгивать через ГОТО.
-
А можно в подпрограмме использовать команду HALT? При перезапуске сценария по Alt+A параметры стека ведь пересоздадутся?
-
Везде можно использовать. Команда HALT эквивалентна Alt+S полная остановка выполнения.
-
Господа спасибо огромное! Только проблема я не могу разобраться с этими подпрограммы. Я не могу понять как они пишутся.
-
Чтоб не плодить темы, спрошу тут ;D
Господа, есть работающий скрипт, условно
$y1 = 470
$y2 = 505
$Xw = 360 // ввести координату "X" левого верхнего угла окна
$Yw = 0 // ввести координату "Y" левого верхнего угла окна
$Xud1 = 534 // ввести координату "X" точки заброса удочки № 1
$Yud1 = 425 // ввести координату "Y" точки заброса удочки № 1
$Xud2 = 651 // ввести координату "X" точки заброса удочки № 2
// ну и так далее
Потребляет 3-5% процессорной мощности. Решил разнообразить его потоками (для отслеживания всплывающих окон и закрытия их) по предложению Oravena, из этой темы. Как только объявляю первый поток
THREAD(main, 1) // главный скрипт
$y1 = 470
$y2 = 505
$Xw = 360 // ввести координату "X" левого верхнего угла окна
$Yw = 0 // ввести координату "Y" левого верхнего угла окна
.
.
.
END_THREAD
Скрипт начинает потреблять 25-30% процессорной мощности. Это правильно? И отчего так?
-
Ответ спрятан за точками.
Нет работающей задержки.
-
Как бэ и не в задержках дело. Скрипт без объявления потока потребляет мало - там и задержки есть и все остальное. Я ведь что делаю, первой строчкой объявляю начало потока, последней объявляю конец потока, больше никаких изменений в скрипт не вношу и сразу, бац, проц грузится на лишних 25%.
-
Ок, спасибо! Придется с этим как-то жить :'(
-
Так у меня и так все это сделано. Я ж говорю, скрипт БЕЗ потока потребляет 3-5%, делаю только ОДИН поток, сразу 25-30%!
-
Как бэ и не в задержках дело. Скрипт без объявления потока потребляет мало - там и задержки есть и все остальное. Я ведь что делаю, первой строчкой объявляю начало потока, последней объявляю конец потока, больше никаких изменений в скрипт не вношу и сразу, бац, проц грузится на лишних 25%.
Давай поспорим что в задержках?
Как это ты добавив две строки не вносишь изменения? Ты этими действиями добавил +1 поток к существующему. Основной скрипт это тоже поток, только явно не объявленный и его нельзя отключить.
Ты создал второй поток, а основной оставил пустым. А он выполняется в цикле. Вот тебе постоянный пустой цикл без задержки.
С какой целью ты это сделал, непонятно. Если это просто промежуточный этап большого скрипта и ты хотел посмотреть...
Сейчас добавь любую задержку снаружи твоих добавленных строк и посмотри. Ну не любую, от 10 мс.
-
В том-то все и дело, что я не делаю "основной скрипт+новый поток". Для начала, я, весь основной скрипт "заключаю" в поток, т.е. у меня есть только один поток и больше ничего. Но я признаю, что был не прав - после строчки окончания потока, добавил задержку и все наладилось. Почему так происходит, у меня не хватает ума понять. Казалось бы, есть скрипт, работает, крутится, потребляет свои 3% и все хорошо, ну добавил я к нему в начале и в конце 2 строчки, обозвав его потоком... Что изменилось в поведении скрипта и зачем ему теперь понадобилась в конце задержка? Я, конечно еще слоупок в скриптописании, но хотелось бы понять в чем дело :)
-
В том-то все и дело, что я не делаю "основной скрипт+новый поток". Для начала, я, весь основной скрипт "заключаю" в поток, т.е. у меня есть только один поток и больше ничего...
Ты ошибаешься. Я же объяснил: основной скрипт это уже один поток. Он основной. Есть всегда. Остановить его нельзя (только HALT). И зациклен так же по кругу.
THREAD...END_THREAD ему не нужны. Можно сказать что они есть, но не отображаются, так понятней.
При добавлении THREAD...END_THREAD ты создал ВТОРОЙ поток, дочерний. При этом в основном осталось пусто.
Теперь у тебя крутится два потока. Один твой и один основной пустой. В нём нет ничего, ни одной команды одна NOP или PASS. Вот процессор и грузится. Нет разгружающих его WAIT
То же происходит, если нет задержки в потоке. Попробуй так
THREAD(two, 1)
$b = 1
END_THREAD
Или если они есть, но есть условия, когда они не работают
THREAD(two, 1)
$b = 1
IF($b = 3)
LCLICK(10,10)
WAITMS(100)
END_IF
END_THREAD
-
Так уже понятнее, но уточню еще раз:
было: (чисто пример)
WAITMS (RND(150, 300))
KEYPRESS (#SPACE)
WAITMS (RND(300, 500))
стало:
THREAD(main, 1)
WAITMS (RND(150, 300))
KEYPRESS (#SPACE)
WAITMS (RND(300, 500))
END_THREAD
Как я понял, у меня теперь организовалось ДВА потока - один пустой основной, без операторов, но который все равно жрет мощности и второй по имени "main". И их нужно ограничить задержкой в самом конце. Так или не так я понял?
-
Так. Но эти манипуляции не имеют смысла, если и дальше так останется.
Твой "было" и так уже поток и отделять его не нужно.
-
Так мне, в моем настоящем скрипте, нужно будет приостанавливать главный поток на время выполнения дополнительного потока. Т.е. основной скрипт крутится, но изредка выпрыгивают "левые" окна - вот их и будет закрывать доп. поток. Как я понял из объяснений Oravena (в этой теме), чтобы так работало нужно чтобы скрипты были "разведены" по потокам. Закрывать "левые" окна из основного скрипта (без организации потоков) у меня не получается, скрипт их почему-то игнорирует (не видит).
-
Ну тогда паузу и всё.
THREAD(main, 1)
// основной
END_THREAD
THREAD(error, 1)
// отловщик
END_THREAD
// корневой
WAIT(3600)
Хотя, если контролирующий не останавливается, пусть он будет корневым
THREAD(main, 1)
// основной
END_THREAD
// отловщик
// блаблабла
-
О, да. Хорошая мысль, так и буду пробовать. Ведь ловильщик и вправду не останавливается. Спасибо за разъяснения, еще немного знаний приобрел :)