Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: bpa on February 16, 2015, 09:17:39 AM

Title: нужна помощь
Post by: bpa on February 16, 2015, 09:17:39 AM
помогите с скриптом. Я написал скрипт под игру. Правельно ли? И иногда в промежутках выскакивают окна где нужно нажимать на кнопки подтверждения. Вот их я и не знаю как победить
Code: [Select]
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)     

Title: Re: нужна помощь
Post by: Oraven on February 16, 2015, 11:01:08 AM
Используй потоки, один поток выполняет твой скрипт а другой параллельно следит за окнами.

Если второй поток найдет окно то нужно поставить на паузу первый поток вот такой командой
Code: (clickermann) [Select]
SETTHREAD (main, 0)убрать окно и продолжить выполнение первого потока командой
Code: (clickermann) [Select]
SETTHREAD (main, 1)
Code: (clickermann) [Select]
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)

Title: Re: нужна помощь
Post by: bpa on February 16, 2015, 02:19:40 PM
спасибо. а три потока потянет?
Title: Re: нужна помощь
Post by: Andrey_13 on February 16, 2015, 02:32:30 PM
Можно напишу в Вашей теме, просто меня тоже этот вопрос интересовал.
если я использую подпрограммы, то все это будет выглядеть так:

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


Title: Re: нужна помощь
Post by: Oraven on February 16, 2015, 03:22:25 PM
спасибо. а три потока потянет?

Сколько угодно потянет.

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

Неверно, подпрограммы должны описываться в том же потоке.
Code: (clickermann) [Select]
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

И подпрограммы целесообразно использовать только при многочисленном повторении куска кода.
Title: Re: нужна помощь
Post by: Andrey_13 on February 16, 2015, 03:56:24 PM
Quote
И подпрограммы целесообразно использовать только при многочисленном повторении куска кода.
Это относится только при использовании потоков или вообще?
Я думал, что с  подпрограммами скрипт будет более гибким, можно включать и отключать оперативно часть подпрограмм.
А чем грозит, если подпрограмм будет много?
Title: Re: нужна помощь
Post by: Oraven on February 16, 2015, 04:37:59 PM
А чем грозит, если подпрограмм будет много?
Ничем.

Я думал, что с  подпрограммами скрипт будет более гибким, можно включать и отключать оперативно часть подпрограмм.

Представь что ты читаешь книгу с кучей ссылок. Вместо того чтобы сразу прочитать текст ты вынужден метаться в конец книги за разъяснениями. Кликеру все равно а вот пользователю сложнее разбираться в коде.

Если хочешь отключить часть кода. просто заключи его в условие, а в начале кода напиши переменные для настройки

Code: (clickermann) [Select]
$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

Использование подпрограмм накладывает некоторые ограничения, из них не рекомендуется выпрыгивать через ГОТО.
Title: Re: нужна помощь
Post by: And_Ro on February 16, 2015, 05:45:30 PM
А можно в подпрограмме использовать команду HALT? При перезапуске сценария по Alt+A параметры стека ведь пересоздадутся?
Title: Re: нужна помощь
Post by: Oraven on February 16, 2015, 05:54:56 PM
Везде можно использовать. Команда HALT эквивалентна Alt+S полная остановка выполнения.
Title: Re: нужна помощь
Post by: bpa on February 16, 2015, 06:59:42 PM
Господа спасибо огромное! Только проблема я не могу разобраться с этими подпрограммы. Я не могу понять как они пишутся.
Title: Re: нужна помощь
Post by: BubukaBomb on February 18, 2015, 08:20:13 PM
Чтоб не плодить темы, спрошу тут  ;D
Господа, есть работающий скрипт, условно
Code: (clickermann) [Select]
$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, из этой темы.  Как только объявляю первый поток

Code: (clickermann) [Select]
THREAD(main, 1) // главный скрипт
$y1 = 470
$y2 = 505

$Xw = 360     // ввести координату "X" левого верхнего угла окна

$Yw = 0       // ввести координату "Y" левого верхнего угла окна
.
.
.
END_THREAD

Скрипт начинает потреблять 25-30% процессорной мощности. Это правильно? И отчего так?
Title: Re: нужна помощь
Post by: Vint on February 18, 2015, 08:36:16 PM
Ответ спрятан за точками.
Нет работающей задержки.
Title: Re: нужна помощь
Post by: BubukaBomb on February 18, 2015, 08:54:16 PM
Как бэ и не в задержках дело. Скрипт без объявления потока потребляет мало - там и задержки есть и все остальное. Я ведь что делаю, первой строчкой объявляю начало потока, последней объявляю конец потока, больше никаких изменений в скрипт не вношу и сразу, бац, проц грузится на лишних 25%.
Title: Re: нужна помощь
Post by: BubukaBomb on February 18, 2015, 11:13:49 PM
Ок, спасибо! Придется с этим как-то жить  :'(
Title: Re: нужна помощь
Post by: BubukaBomb on February 18, 2015, 11:33:03 PM
Так у меня и так все это сделано. Я ж говорю, скрипт БЕЗ потока потребляет 3-5%, делаю только ОДИН поток, сразу 25-30%!
Title: Re: нужна помощь
Post by: Vint on February 19, 2015, 06:53:58 AM
Как бэ и не в задержках дело. Скрипт без объявления потока потребляет мало - там и задержки есть и все остальное. Я ведь что делаю, первой строчкой объявляю начало потока, последней объявляю конец потока, больше никаких изменений в скрипт не вношу и сразу, бац, проц грузится на лишних 25%.
Давай поспорим что в задержках?
Как это ты добавив две строки не вносишь изменения? Ты этими действиями добавил +1 поток к существующему. Основной скрипт это тоже поток, только явно не объявленный и его нельзя отключить.
Ты создал второй поток, а основной оставил пустым. А он выполняется в цикле. Вот тебе постоянный пустой цикл без задержки.
С какой целью ты это сделал, непонятно. Если это просто промежуточный этап большого скрипта и ты хотел посмотреть...
Сейчас добавь любую задержку снаружи твоих добавленных строк и посмотри. Ну не любую, от 10 мс.
Title: Re: нужна помощь
Post by: BubukaBomb on February 19, 2015, 10:32:22 AM
В том-то все и дело, что я не делаю "основной скрипт+новый поток". Для начала, я, весь основной скрипт "заключаю" в поток, т.е. у меня есть только один поток и больше ничего. Но я признаю, что был не прав - после строчки окончания потока, добавил задержку и все наладилось. Почему так происходит, у меня не хватает ума понять. Казалось бы, есть скрипт, работает, крутится, потребляет свои 3% и все хорошо, ну добавил я к нему в начале и в конце 2 строчки, обозвав его потоком... Что изменилось в поведении скрипта и зачем ему теперь понадобилась в конце задержка? Я, конечно еще слоупок в скриптописании, но хотелось бы понять в чем дело  :)
Title: Re: нужна помощь
Post by: Vint on February 19, 2015, 11:19:03 AM
В том-то все и дело, что я не делаю "основной скрипт+новый поток". Для начала, я, весь основной скрипт "заключаю" в поток, т.е. у меня есть только один поток и больше ничего...
Ты ошибаешься. Я же объяснил: основной скрипт это уже один поток. Он основной. Есть всегда. Остановить его нельзя (только HALT). И зациклен так же по кругу.
THREAD...END_THREAD ему не нужны. Можно сказать что они есть, но не отображаются, так понятней.

При добавлении THREAD...END_THREAD ты создал ВТОРОЙ поток, дочерний. При этом в основном осталось пусто.
Теперь у тебя крутится два потока. Один твой и один основной пустой. В нём нет ничего, ни одной команды одна NOP или PASS. Вот процессор и грузится. Нет разгружающих его WAIT

То же происходит, если нет задержки в потоке. Попробуй так
Code: (clickermann) [Select]
THREAD(two, 1)
   $b = 1
END_THREAD

Или если они есть, но есть условия, когда они не работают
Code: (clickermann) [Select]
THREAD(two, 1)
   $b = 1
   IF($b = 3)
      LCLICK(10,10)
      WAITMS(100)
   END_IF   
END_THREAD
Title: Re: нужна помощь
Post by: BubukaBomb on February 19, 2015, 11:41:25 AM
Так уже понятнее, но уточню еще раз:
было: (чисто пример)

Code: (clickermann) [Select]
WAITMS (RND(150, 300))
KEYPRESS (#SPACE)
WAITMS (RND(300, 500))

стало:

Code: (clickermann) [Select]
THREAD(main, 1)
WAITMS (RND(150, 300))
KEYPRESS (#SPACE)
WAITMS (RND(300, 500))
END_THREAD

Как я понял, у меня теперь организовалось ДВА потока - один пустой основной, без операторов, но который все равно жрет мощности и второй по имени "main". И их нужно ограничить задержкой в самом конце. Так или не так я понял?
Title: Re: нужна помощь
Post by: Vint on February 19, 2015, 11:51:06 AM
Так. Но эти манипуляции не имеют смысла, если и дальше так останется.
Твой "было" и так уже поток и отделять его не нужно.
Title: Re: нужна помощь
Post by: BubukaBomb on February 19, 2015, 12:18:05 PM
Так мне, в моем настоящем скрипте, нужно будет приостанавливать главный поток на время выполнения дополнительного потока. Т.е. основной скрипт крутится, но изредка выпрыгивают "левые" окна - вот их и будет закрывать доп. поток. Как я понял из объяснений Oravena (в этой теме), чтобы так работало нужно чтобы скрипты были "разведены" по потокам. Закрывать "левые" окна из основного скрипта (без организации потоков) у меня не получается, скрипт их почему-то игнорирует (не видит).
Title: Re: нужна помощь
Post by: Vint on February 19, 2015, 12:50:42 PM
Ну тогда паузу и всё.
Code: (clickermann) [Select]
THREAD(main, 1)
   // основной
END_THREAD

THREAD(error, 1)
   // отловщик
END_THREAD

// корневой
WAIT(3600)

Хотя, если контролирующий не останавливается, пусть он будет корневым
Code: (clickermann) [Select]
THREAD(main, 1)
   // основной
END_THREAD

// отловщик
// блаблабла
Title: Re: нужна помощь
Post by: BubukaBomb on February 19, 2015, 01:12:46 PM
О, да. Хорошая мысль, так и буду пробовать. Ведь ловильщик и вправду не останавливается. Спасибо за разъяснения, еще немного знаний приобрел  :)