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

Основной раздел => Общие вопросы => Учебные статьи => Тема начата: Johnny от Октябрь 25, 2014, 09:32:54 am

Название: Потоки
Отправлено: Johnny от Октябрь 25, 2014, 09:32:54 am
Актуально для версии 4.11+

Многопоточность в Clickermann

Как все знают со школы, Windows – многозадачная операционная система. Впрочем, как и большинство современных ОС, за исключением особо специализированных. Это значит, что на машине под управлением ОС могут одновременно выполняться несколько задач, в нашем случае приложений. Можно долго рассуждать на тему, что одно неудачное действие повесит все намертво и что задачи выполняются не параллельно, а просто быстро переключаются друг между другом. Но примем это за аксиому.
Подобно этому, в составе приложения можно организовать несколько потоков (нитей, англ. thread). И они точно так же могут выполняться параллельно, как и сами приложения. С рядом оговорок. Во-первых, потоки могут свободно использовать общие данные своего родительского приложения. Во-вторых (хотя косвенно это вытекает из первого) потоки могут останавливать друг друга, снова запускать и так далее.
Для чего нужны потоки? Для оптимизации работы. Если взять за догмат то, что две параллельные задачи выполняются по крайней мере не медленнее, чем две последовательные (хотя это спорное утверждение), то целесообразно наиболее ресурсоемкие выделять в отдельные потоки. Это позволит выиграть в общем логическом быстродействии. Поясню почему. Если один какой-то поток повиснет, серьезно задумается или в нем произойдет сбой, это не убьет (замедлит) приложение целиком. Это вы можете наблюдать например в браузере Хром, где повисание одной вкладки не парализует весь браузер. Огнелиса так не умеет…
Существует лишь одна особенность – разделение ресурсов. При прочих, равных нельзя знать в какой момент начнет и бросит выполняться поток, помещать в них стоит относительно автономные задачи. Плохая идея в одном потоке наращивать переменную, а в другом записывать ее значение в файл столбиком. Пропуски значений и наоборот повторяющиеся – обычное дело при данном некорректном логическом подходе. Для решения этой задачи используются общие переменные флаги – «семафоры», анализируя которые потоки понимают, какой из них отработал и чья очередь теперь выполнить свою задачу.
Перейдем наконец к коду. Поток в кликермане объявляется следующим, похожим на подпрограмму, образом.
Код: Clickermann
  1. Thread(thr_name)
  2. // тело потока
  3. End_thread

Данный поток с именем thr_name начнет крутиться сразу после старта скрипта. Если вы хотите что бы поток запустился позже, то необходимо в шапке после имени добавить 0. То есть
Код: Clickermann
  1. Thread(thr_name, 0)
  2. // тело потока
  3. End_thread

Теперь данный поток можно запустить лишь из самого скрипта специальной процедурой контроля потоков setThread:
Код: Clickermann
  1. setThread(thr_name, 1)
в которой thr_name – имя потока, а 1 – присваиваемое состояние «запущен», заменив которое на 0 можно так же приостановить поток. Потоки могут невозбранно контролировать друг друга.

Каждый поток обладает собственным адресным пространством, поэтому задержка wait() в одном ни коим образом не влияет на остальные потоки. При этом, потоки имеют доступ к общим переменным и графическому буферу. Стоит отметить, что из-за особенностей архитектуры кликера, подпрограммы Sub() не могут разделяться потоками, поэтому для каждого они индивидуальны и должны быть объявлены внутри потока. Другими словами, подпрограммы описанные внутри одного потока не могут быть вызваны другим потоком.
Основное (абстрактно) тело скрипта, даже если оно описано без thread() .. end_thread так же является отдельным потоком, поэтому для него справедливо все вышесказанное. Поэтому фактически, сценарии вида
Код: Clickermann
  1. Thread(thr1)
  2.   Wait(1)
  3. End_thread
  4.  
  5. Print("Hello")
  6. Wait(3)
И
Код: Clickermann
  1. Thread(thr1)
  2.   Wait(1)
  3. End_thread
  4.  
  5. Thread(thr2)
  6.   Print("Hello")
  7. Wait(3)
  8. End_thread
Абсолютно одинаковы.
Последнее что вам необходимо знать, это то, что как и основной скрипт, потоки должны «давать передохнуть» процессору, поэтому потрудитесь разместить внутри них wait’ы, на которые он обязательно наткнется, иначе ваш сценарий будет серьезно нагружать процессор в ряде случаев.

Несколько показательных примеров
Первый случай, о котором иногда спрашивают – это нажатие клавиш (да и вообще действия) по интервалу. Например, каждые 3 секунды жмем A, каждые 5 секунд – B. В обычном случае нам бы потребовался единичный интервал (секунда) и два счетчика, которые наращиваются. Затем в двух условиях проверяются их значения и если счетчик достиг 3 (или 5) то выполняются действия и счетчик обнуляется. Два счетчика нужны, потому что действия независимы друг от друга. Сам скрипт выглядит так (для удобства сами нажатия заменены на вывод в лог)
Код: Clickermann
  1. wait(1)
  2. $cnt1 = $cnt1 + 1
  3. $cnt2 = $cnt2 + 1
  4.  
  5. if($cnt1 = 3)
  6.   print("A")
  7.   $cnt1 = 0
  8. end_if
  9.  
  10. if($cnt2 = 5)
  11.   print("B")
  12.   $cnt2 = 0
  13. end_if

При этом, если внутри условия будет ряд других затратных инструкций или упаси Боже задержка – в классическом решении реализовать такое было бы весьма затратно (приходилось бы вычислять временные затраты на каждое действие, вводить поправки на разницу и т.д.)
Реализуем тот же самый скрипт на потоках
Код: Clickermann
  1. thread(th1)
  2.   print("A")
  3.   wait(3)
  4. end_thread
  5.  
  6. thread(th2)
  7.   print("B")
  8.   wait(5)
  9. end_thread

Как вы видите, во первых скрипт стал более компактный и гораздо удобнее воспринимается визуально. Во вторых, даже если в первом потоке реализовать часовую задержку, второй поток стабильно продолжит чеканить B каждые 5 секунд.

Второе распространенное решение –  реализация псевдо хоткеев через iskeydown(). Как вы знаете эта функция проверяет нажата ли клавиша. Но проверить это она может только в момент собственного выполнения. То есть если у вас есть два условия с iskeydown() и первое сработало, то в том случае если внутри него будут пресловутые задержки и долгие действия, проверить нажатие второй клавиши удастся только когда первое условие отработает целиком.
Пример старого образца. Два последовательных условия, которые в случае нажатия клавиши печатают ее в лог каждые 3 секунды наши любимые буквы A и B. Поскольку задержка в каждом условии составляет 3 секунды, то у вас не получится вывести в протокол сразу обе буквы даже если вы зажмете обе клавиши одновременно.

Код: Clickermann
  1. if (iskeydown(#A)=1)
  2.   print("A")
  3.   wait(3)
  4. end_if
  5.  
  6. if (iskeydown(#B)=1)
  7.   print("B")
  8.   wait(3)
  9. end_if
  10.  
  11. waitms(10)

Безусловно, можно попробовать добавить третье условие двойной проверки обоих нажатий iskeydown() & iskeydown(), но тогда будут срабатывать и одиночные условия, ведь клавиша то зажата. Неразрешимая для неискушенного программиста задача элементарно решается введением потоков под каждый хоткей.
Код: Clickermann
  1. thread(th1)
  2.   if (iskeydown(#A)=1)
  3.      print("A")
  4.      wait(3)
  5.   end_if
  6.   waitms(10)
  7. end_thread
  8.  
  9.  
  10. thread(th2)
  11.   if (iskeydown(#B)=1)
  12.      print("B")
  13.      wait(3)
  14.   end_if
  15.   waitms(10)
  16. end_thread

Визуально код стал более объемным, однако не стоит забывать, что в отличие от первого, этот – работает. Вы легко можете зажимать клавиши хоть одновременно, хоть как – такты не собьются.
Таким образом, потоки позволяют легко решить ряд прикладных задач, которые до этого решались если не запущенными копиями кликера, то как минимум жуткими костылями. И их потенциал неограничен приведенными примерами, конечно же.
Название: Re: Потоки
Отправлено: i0 от Октябрь 25, 2014, 02:19:14 pm
подпрограммы описанные внутри одного потока не могут быть вызваны другим потоком
прошу пример
Название: Re: Потоки
Отправлено: Johnny от Октябрь 25, 2014, 03:10:43 pm
подпрограммы описанные внутри одного потока не могут быть вызваны другим потоком
прошу пример
да никакого особого примера не нужно. просто если хочется использовать подпрограмму внутри потока то оформление должно быть таким

Код: Clickermann
  1. thread(th1)
  2.  
  3.  sub(inside)
  4.    // ...
  5.  end_sub
  6.  
  7.  // call
  8.  inside()
  9.  
  10. end_thread

а вот так работать НЕ будет:

Код: Clickermann
  1. sub(outside)
  2.  // ...
  3. end_sub
  4.  
  5.  
  6. thread(th1)
  7.  // call
  8.  outside()
  9.  
  10. end_thread

объективно эту проблему можно решить в обозримом будущем, но пока держите это в голове
Название: Re: Потоки
Отправлено: i0 от Октябрь 25, 2014, 04:59:31 pm
если один и тот же саб нужен для работы разным потокам, его можно (и нужно) включить в каждый тред инклюдом?
норм, и читабельность не портится. главное – не забыть.
Название: Re: Потоки
Отправлено: Hito от Октябрь 29, 2014, 12:38:14 pm
Вопросик...

Код: Clickermann
  1. Thread(thr_name)
  2.   // Фармим мобов
  3. End_thread
  4.  
  5. GETSCREEN
  6. IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
  7.   setThread(thr_name, 0)
  8.   WAITMS(50)
  9. ELSE
  10.   setThread(thr_name, 1)
  11.   WAITMS(50)
  12. END_IF

Возможно ли НЕ выключать поток, А ставить его на паузу и снимать с паузы?
Название: Re: Потоки
Отправлено: Oraven от Октябрь 29, 2014, 01:03:10 pm
Возможно ли НЕ выключать поток, А ставить его на паузу и снимать с паузы?

Как раз таки он и ставится только на паузу, а мне бы вот перезапуск бы сильно не помешал :\
Название: Re: Потоки
Отправлено: Hito от Октябрь 29, 2014, 01:04:05 pm
Возможно ли НЕ выключать поток, А ставить его на паузу и снимать с паузы?

Как раз таки он и ставится только на паузу, а мне бы вот перезапуск бы сильно не помешал :\

Ну да... Хорошо бы, чтобы, и такая команда была, и такая...
Название: Re: Потоки
Отправлено: Prorok.18 от Ноябрь 01, 2014, 04:08:58 pm
Многопоточность это здорово, но как мне перевести строку из INIREAD в число? ;)
P. S. Дождемся ли мы когда кликер сможет сворачиваться не в трей, а в панель задач? Спасибо.
Название: Re: Потоки
Отправлено: Atas от Ноябрь 01, 2014, 04:28:49 pm
Многопоточность это здорово, но как мне перевести строку из INIREAD в число? ;)

Цитата из справки Clickermann v4.11 (build 000)

INT

Синтаксис
INT (num) - числовая функция; возвращает целую часть числа без округления

Параметры 
num - число

Пример 

$var = int(25.73)
print($var)   // 25

Примечания 
Так же может переводить некоторые строки в числа . Например, строку, содержащую шестнадцатиричное представление числа.
Если вам нужно округлить число до заданной точности, см. функцию ROUND

Название: Re: Потоки
Отправлено: Prorok.18 от Ноябрь 01, 2014, 04:56:38 pm
Цитировать
INT (num) - числовая функция; возвращает целую часть числа без округления
Спасибо большое, работает! И кто догадался до этого
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 01, 2014, 05:00:57 pm
P. S. Дождемся ли мы когда кликер сможет сворачиваться не в трей, а в панель задач? Спасибо.

Он всегда это мог
Файл Clickermann\data\config.ini
; Если 1, то в свернутом состоянии программа не будет отображаться на панели задач
; Только в системном трее
only_tray = 1
Название: Re: Потоки
Отправлено: Alekzandr от Ноябрь 03, 2014, 04:11:49 pm
Здравствуйте! Есть 2 потока, у каждого после его работы свой период ожидания, подскажите, можно ли сделать, чтобы если у одного из них вышел назначенный период ожидания, а в это время совершает какую-то работу другой, первый чтоб продлил свое ожидание, дождался когда другой дойдет до своего wait(...),  и только тогда делал свои действия.
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 03, 2014, 04:16:26 pm
А смысл тебе тогда потоки делать?

Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   // условие сработает снова через 60 сек
  3.  
  4.   $time1 = $_time_t + 60
  5. END_IF
  6.  
  7. IF($time2 < $_time_t)
  8.   // условие сработает снова через 2 минуты
  9.  
  10.   $time2 = $_time_t + 120
  11. END_IF
  12.  
  13. WAIT(1)
Название: Re: Потоки
Отправлено: Alekzandr от Ноябрь 03, 2014, 04:24:58 pm
Да, спасибо, мне так и нужно.
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 10:40:10 am
Доброго времени. Что-то не работает поток в моем случае, я открываю 1 окно (делаю на передний план) - копирую из него текст, затем открываю 2 окно и вставляю текст туда. Но как только в поток эти действия включаю - перестает работать:

#name "test_3"
WNDBUMP(65994)

WAIT(1)

DBLCLICK(462,425)

WAIT(1)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)

WAIT(1)

WNDBUMP(197118)

WAIT(1)

WAITMS(300)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#V)
WAITMS (50)
KEYUP (#V)
KEYUP (#CTRL)
waitms(200)

KEYPRESS(#ENTER)

HALT
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 02:18:31 pm
Доброго времени. Что-то не работает поток в моем случае, я открываю 1 окно (делаю на передний план) - копирую из него текст, затем открываю 2 окно и вставляю текст туда. Но как только в поток эти действия включаю - перестает работать:

#name "test_3"
WNDBUMP(65994)

WAIT(1)

DBLCLICK(462,425)

WAIT(1)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#C)
WAITMS (50)
KEYUP (#C)
KEYUP (#CTRL)

WAIT(1)

WNDBUMP(197118)

WAIT(1)

WAITMS(300)
KEYDOWN (#CTRL)
WAITMS (50)
KEYDOWN (#V)
WAITMS (50)
KEYUP (#V)
KEYUP (#CTRL)
waitms(200)

KEYPRESS(#ENTER)

HALT

А я че-то и не вижу у тебя тут созданного потока...
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 02:51:32 pm
Вот твой скрипт с потоком:

Код: Clickermann
  1. THREAD(name)  // Начало потока
  2.  
  3.   WNDBUMP(65994)
  4.  
  5.   WAIT(1)
  6.  
  7.   DBLCLICK(462,425)
  8.  
  9.   WAIT(1)
  10.   KEYDOWN (#CTRL)
  11.   WAITMS (50)
  12.   KEYDOWN (#C)
  13.   WAITMS (50)
  14.   KEYUP (#C)
  15.   KEYUP (#CTRL)
  16.  
  17.   WAIT(1)
  18.  
  19.   WNDBUMP(197118)
  20.  
  21.   WAIT(1)
  22.  
  23.   WAITMS(300)
  24.   KEYDOWN (#CTRL)
  25.   WAITMS (50)
  26.   KEYDOWN (#V)
  27.   WAITMS (50)
  28.   KEYUP (#V)
  29.   KEYUP (#CTRL)
  30.   waitms(200)
  31.  
  32.   KEYPRESS(#ENTER)
  33.  
  34.   HALT
  35.  
  36. END_THREAD  // Конец потока
  37.  
  38. BEEP(800,200)  // Команда работает параллельно с потоком
  39. WAIT(1)
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 03:47:20 pm
Спасибо, этот теперь работает. Но только если делать окно активным, а если вместо WNDBUMP поставить HSET - то снова не работает. Мне из 2х и более окон одновременно нужно скопировать информацию в 1 окно.
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 03:52:07 pm
Спасибо, этот теперь работает. Но только если делать окно активным, а если вместо WNDBUMP поставить HSET - то снова не работает. Мне из 2х и более окон одновременно нужно скопировать информацию в 1 окно.

Я не понял... Ты отдельные потоки хочешь привязать к разным окнам в одном скрипте чтоли? Я конечно вообще не в курсе, но мне кажется, что к окну у нас привязывается не скрипт, а сам кликер. То есть, внутри кликера макрос не сможет разные потоки привязать к разным окнам.
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 03:58:13 pm
Ааа.. теперь понял:) Да, я хотел в 1 потоке к разным окнам привязать:) делал HSET(номер,1) потом HSET(номер,0) и также следующее окно ;D
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 04:00:59 pm
Ааа.. теперь понял:) Да, я хотел в 1 потоке к разным окнам привязать:) делал HSET(номер,1) потом HSET(номер,0) и также следующее окно ;D

Ну, если привязка и отвязка будет последовательной (то есть - сначала привязался кликер к одному окну, потом к другому и так далее), то это возможно. Но привязываясь к окну "2", кликер отвяжется от окна "1".
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 04:24:18 pm
Тут цифры окон только поменял (перезапустил браузер и блокнот) но алгоритм тот-же, Ctrl+C и Ctrl+V не срабатывают:
THREAD(name)
   //WNDBUMP(197198)
   HSET(197198,1)   
 
   WAIT(1)
 
   DBLCLICK(526,704)
   
   WAIT(1)
   KEYDOWN (#CTRL)
   WAITMS (50)
   KEYDOWN (#C)
   WAITMS (50)
   KEYUP (#C)
   KEYUP (#CTRL)
   
   HSET(197198,0)
 
   WAIT(1)

   //WNDBUMP(328256)
   HSET(328256,1)
 
   WAIT(1)
 
   WAITMS(300)
   KEYDOWN (#CTRL)
   WAITMS (50)
   KEYDOWN (#V)
   WAITMS (50)
   KEYUP (#V)
   KEYUP (#CTRL)
   waitms(200)
 
   KEYPRESS(#ENTER)
   
   HSET(328256,0)
 
   HALT
 
END_THREAD  //
 
BEEP(800,200)  //
WAIT(1)
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 04:37:21 pm
Ты на ноуте, или на компе макрос запускаешь?
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 04:41:23 pm
на ноуте, поставил win 10 тестовую, и на ноуте есть еще vmware win XP пробую и там и там
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 04:51:11 pm
На - пробуй:

Код: Clickermann
  1. #ps2_keyboard
  2. #ps2_mouse
  3. THREAD(name)
  4.   //WNDBUMP(197198)
  5.   HSET(197198,1)
  6.  
  7.   WAIT(1)
  8.  
  9.   DBLCLICK(526,704)
  10.  
  11.   WAIT(1)
  12.   KEYDOWN (#CTRL)
  13.   WAITMS (100)
  14.   KEYPRESS(#C)
  15.   WAITMS (50)
  16.   KEYUP (#CTRL)
  17.  
  18.   HSET(197198,0)  // Этот параметр не обязателен. При выполнении команды из 23-ей строки, кликер автоматом отвяжется от окна "197198" и привяжется к "328256".
  19.  
  20.   WAIT(1)
  21.  
  22.   //WNDBUMP(328256)
  23.   HSET(328256,1)
  24.  
  25.   WAIT(1)
  26.  
  27.   WAITMS(300)
  28.   KEYDOWN (#CTRL)
  29.   WAITMS (100)
  30.   KEYPRESS(#V)
  31.   WAITMS (50)
  32.   KEYUP (#CTRL)
  33.   waitms(200)
  34.  
  35.   KEYPRESS(#ENTER)
  36.  
  37.   HSET(328256,0)
  38.  
  39.   HALT
  40.  
  41. END_THREAD  //
  42.  
  43. BEEP(800,200)  // Тут никаких HSET, так как у тебя работают последовательные привязки в потоке.
  44. WAIT(1)
Название: Re: Потоки
Отправлено: Alex59 от Ноябрь 16, 2014, 06:58:59 pm
Спасибо большое за оперативную помощь! Но увы, этот вариант тоже не работает. Завтра на работе буду кумекать что к чему :o
Название: Re: Потоки
Отправлено: Vint от Ноябрь 16, 2014, 08:54:13 pm
Да что же блин такое...
   KEYDOWN ()
   KEYUP ()
Не работают в режиме привязки, 100500 раз упоминалось, в половине тем на форуме и каждые 20 постов в группе.
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2014, 08:57:08 pm
Да что же блин такое...
   KEYDOWN ()
   KEYUP ()
Не работают в режиме привязки, 100500 раз упоминалось, в половине тем на форуме и каждые 20 постов в группе.

Через раз... У меня бывало, что и работало... Потому и предложил попробовать режиме PS/2
Название: Re: Потоки
Отправлено: i0 от Ноябрь 20, 2014, 01:27:21 am
Потоки могут невозбранно контролировать друг друга
Цитата: Clickermann Help
SetThread (thread_name, state) - меняет состояние дочернего потока

так всё таки только дочернего или любого?
Название: Re: Потоки
Отправлено: Hito от Ноябрь 20, 2014, 12:34:37 pm
Потоки могут невозбранно контролировать друг друга
Цитата: Clickermann Help
SetThread (thread_name, state) - меняет состояние дочернего потока

так всё таки только дочернего или любого?

На сколько я понял, из дочернего потока не проконтролишь, такой командой, дочерний поток. Только из основного дочерний. Или я ошибаюсь?
Название: Re: Потоки
Отправлено: Johnny от Ноябрь 22, 2014, 11:47:55 am
дочерним тут обозван явно объявленный поток.
а основным - просто привычный всем скрипт без всяких конструкций
Название: Re: Потоки
Отправлено: Hito от Ноябрь 22, 2014, 02:06:28 pm
Ну да ))
Название: Re: Потоки
Отправлено: Kedrick от Ноябрь 23, 2014, 07:24:30 pm
Если в скрипте работает поток, кликерман не эрегирует ни на какие внешние воздействия. При этом он не висит, скрипт работает нормально, но тыкнуть паузу уже бесполезно, только снимать задачу в диспетчере или дожидаться окончания работы скрипта. Это бага или фича?
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 23, 2014, 08:14:19 pm
Если в скрипте работает поток, кликерман не эрегирует ни на какие внешние воздействия. При этом он не висит, скрипт работает нормально, но тыкнуть паузу уже бесполезно, только снимать задачу в диспетчере или дожидаться окончания работы скрипта. Это бага или фича?

эрегирует  :o ::) ;D

Версия последняя? 4.11.001
Если да, скрипт в студию.

Название: Re: Потоки
Отправлено: Луций от Ноябрь 23, 2014, 08:46:44 pm
кто то может мне подсказать хоть один пример применения потоков в скриптах для какой нибудь игры?
Название: Re: Потоки
Отправлено: Kedrick от Ноябрь 23, 2014, 09:12:18 pm
Версия кликермана последняя.

Код: Clickermann
  1.  
  2. HSET(WNDFIND("Персонаж"),1) // находим окно
  3. WNDPOS(WNDFIND("Персонаж"),85,0) // двигаем на место
  4. WNDSIZE(WNDFIND("Персонаж"),1200,1000) // ставим размер
  5.  
  6. #include "func.cms"
  7.  
  8. THREAD(boting, 0) // основной бот
  9. #include "func.cms"
  10.   bot()
  11. END_THREAD
  12.  
  13. THREAD(rest, 1) // ежечасный перезапуск файрфокса для устранения утечки памяти
  14. #include "func.cms"  
  15.   WHILE(1 = 1)
  16.      $time = $_time_t + 3600
  17.      IF($time < $_time_t)
  18.            PRINT("рестарт")
  19.            SetThread (boting, 0) // остановить бота
  20.            KEYPRESS(#HOME)
  21.            LCLICK(710+$x,310+$y)
  22.            waiting()
  23.            HSET(WNDFIND("Персонаж"),0) // отвязаться от окна
  24.            LCLICK(1256,11) // закрыть браузер
  25.            WAIT(5)
  26.            EXECUTE("C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
  27.            WAIT(10)
  28.            HSET(WNDFIND("Персонаж"),1)
  29.            WNDPOS(WNDFIND("Персонаж"),85,0)
  30.            WNDSIZE(WNDFIND("Персонаж"),1200,1000)
  31.            SetThread (boting, 1) // запустить бота
  32.            $time = $_time_t + 3600
  33.      END_IF
  34.   END_CYC
  35. END_THREAD
  36.  
  37. //=============================================
  38. nachalo() // поиск нулевой точки, привязка, рассчет смещения координат кнопок ...
  39. SetThread (boting, 1)
  40. PRINT("начал ботинг")
  41. $times1 = 0
  42. WHILE($times1 = 0)
  43.   IF(($_time_h = 1) & ($_time_m = 55)) // ботим до 1:55
  44.      SetThread (boting, 0) //в 1:55 остановка потока
  45.      PRINT("остановил ботинг")
  46.      $times1 = 1
  47.   END_IF
  48. END_CYC
  49. IF(($_time_h = 1) & ($_time_m > 55)) // если время больше 1:59 ищем попап
  50.   gift()
  51. END_IF
  52. SetThread (boting, 1) // запуск потока
  53. PRINT("начал ботинг")
  54. WHILE($_time_h < 5) // ботим до 5 утра
  55.   WAITMS(500)
  56. ELSE
  57.   SetThread (boting, 0) // после 5 остановка потока
  58.   PRINT("остановил ботинг")
  59. END_CYC
  60. bay()
  61. HSET(WNDFIND("Персонаж"),0)
  62. EXECUTE("sleep.bat")
  63. halt

Пока писал этот пост, перечитывал и подписывал комментарии, допетрил в чем проблема ))
Код: Clickermann
  1. THREAD(rest, 1) // ежечасный перезапуск файрфокса для устранения утечки памяти
  2. #include "func.cms"  
  3.   WHILE(1 = 1)
  4.      $time = $_time_t + 3600
  5.      IF($time < $_time_t)
  6.            restart()
  7.            $time = $_time_t + 3600
  8.      END_IF
  9.      WAIT(10) // !!!добавил эту паузу и все стало нормально!!!
  10.   END_CYC
  11. END_THREAD
  12.  
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 23, 2014, 10:23:43 pm
Условие
Код: Clickermann
  1. $time = $_time_t + 3600
  2. IF($time < $_time_t)
не может быть выполнено! Ты все время прибавляешь $time и в результате $time никогда не будет меньше $_time_t

Правильно так
Код: Clickermann
  1. DEFINE($time, $_time_t + 3600)
  2. IF($time < $_time_t)

Да в потоках нужно поставить общую задержку, иначе они будут сильно нагружать процессор. Зачем 10 секунд то, достаточно хотя бы 50 миллисекунд. Но в твоем случае секунда сойдет.
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 23, 2014, 10:36:12 pm
кто то может мне подсказать хоть один пример применения потоков в скриптах для какой нибудь игры?

Ну например, бот выполняется в потоке 1, а в основном потоке находятся проверка на помехи, это всякого рода всплывающие сообщения. Проверка тормозит бота в потоке 1, убирает сообщение и снова продолжает поток 1.

Другой вариант, в отдельном потоке проверяется позиция курсора, и если она длительное время не меняется то можно подумать что бот завис, и предпринять какие то действия, перезапуск или отключение.

Ну и самое простое, это нажимать клавиши, но у каждой клавиши своя задержка не тормозящая остальные.
Название: Re: Потоки
Отправлено: Луций от Ноябрь 24, 2014, 12:15:44 am
у меня пока недостаток производительности только в одном - быстрый поиск картинок на большом экране (например по полю бегает кабан и поворачивается 4мя сторонами, у каждой стороны есть 4 спрайта = 16 картинок) я запускаю поиск циклом всех картинок по очереди и одна фаза цикла занимает секунд 10, за это время кабан может пробежать по экрану вдоль и поперек и ниразу не попасть нужным боком в нужный цикл

колормод и область поиска помогают, но всеравно работает не достаточно быстро, потоки тут помогут?
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 24, 2014, 07:36:00 am
у меня пока недостаток производительности только в одном - быстрый поиск картинок на большом экране (например по полю бегает кабан и поворачивается 4мя сторонами, у каждой стороны есть 4 спрайта = 16 картинок) я запускаю поиск циклом всех картинок по очереди и одна фаза цикла занимает секунд 10, за это время кабан может пробежать по экрану вдоль и поперек и ниразу не попасть нужным боком в нужный цикл

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

Используй программу Unique Colors Search (http://crapware.aidf.org/forum/index.php?topic=42.msg572#msg572) для вычисления уникальных пикселов моба.
Название: Re: Потоки
Отправлено: MIG29 от Ноябрь 25, 2014, 03:02:25 pm
Потоки, классно.
А вот основную программу можно прерывать?

Поток можно прервать в самом себе, например:

Код: Clickermann
  1. Theard(Name1) {
  2.  
  3. /*some code here*/
  4.  
  5. SetTheard(Name1, 0);
  6.  
  7. }
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 25, 2014, 03:21:40 pm
А вот основную программу можно прерывать?
Нет.

Поток можно прервать в самом себе, например:
Конечно можно
Код: Clickermann
  1. THREAD(Name1, 1)
  2.   // код
  3.  
  4.   SETTHREAD (Name1, 0)
  5. END_THREAD
Название: Re: Потоки
Отправлено: Vint от Ноябрь 25, 2014, 03:48:31 pm
Потоки, классно.
А вот основную программу можно прерывать?
А основную тоже можно засунуть в поток явно.
Название: Re: Потоки
Отправлено: MIG29 от Ноябрь 28, 2014, 03:25:03 am
Потоки, классно.
А вот основную программу можно прерывать?
А основную тоже можно засунуть в поток явно.

-Те же яйца, только в профиль. 
Основная программа в этом случае будет содержать только вызовы потоков. 
Однако нужно по прежнему управлять временем... когда и какие потоки будут жить, а кому умереть.

Аннет,  я передумал, скорее будет просто этим управлять =)
Название: Re: Потоки
Отправлено: MIG29 от Декабрь 10, 2014, 11:02:30 pm
Перенесите, пожалуйста, если не в ту тему пишу.

Вот скинул скрипт из 4.10 в 4.11.  Прежде потестил и разобрался с потоками.
Но в 4.11 не отображается текущая строка кода и вобще , такое ощущение что выполнение просто зависает...
Кто как отлаживает скрипты в новой версии, колитесь  ::)

Вроде нашел косяк.

while($x - $y)  // Работает в 4.10

4.11 захотела только так :

while( ($x - $y) > 0)
Название: Re: Потоки
Отправлено: MIG29 от Декабрь 10, 2014, 11:29:42 pm
запись в лог, вывод в трей, после отладки всё это переводится в комментарии, а при необходимости опять настроить раскоменчивается кнопкой редактора.

1500 строк + внешние файлы. Какая строка зависла не видно. Print можно вставить в каждую строку как макрос , но нужно чтобы в лог выводилось номер строки.
Раньше была такая возможность (номер строки)?!
Название: Re: Потоки
Отправлено: Vint от Декабрь 11, 2014, 10:17:38 am
Была... но не работала  :) ещё на 4.5 - 4.6
Название: Re: Потоки
Отправлено: Vint от Декабрь 23, 2014, 04:59:03 pm
Развлечения. Скрипт называется Дежа вю (Deja Vu)
Практического применения пока не нашёл.
Код: Clickermann
  1. LOGSHOW (1)
  2. WNDSIZE(WNDFIND("Лог"),250,110)
  3.  
  4. THREAD(log_glue, 1)
  5.   LOGSHOW (1, $_xmouse+10,$_ymouse+18)
  6.   WAITMS(10)
  7. END_THREAD
  8.  
  9. THREAD(SCREEN, 1)
  10.   GETSCREEN
  11.   LOGCLEAR
  12.   LOGWRITE ("X,Y: ", $_xmouse, ",", $_ymouse)
  13.   LOGWRITE ("Цвет: ",PXL($_xmouse,$_ymouse))
  14.   LOGWRITE ("hWND: ", HGET($_xmouse,$_ymouse))
  15.   WAITMS(200)
  16. END_THREAD
  17.  
  18. WHILE(1)
  19.   WAIT(3600)
  20. END_CYC

Вот ещё такой вариант, можно использовать при закрытом редакторе или для вывода значения переменных в реальном времени.
Код: Clickermann
  1. LOGSHOW (1, $_xmax-250, $_ymax-70-110)
  2. WNDSIZE(WNDFIND("Лог"),250,110)
  3. $pos = 0
  4.  
  5. THREAD(log_glue, 1)
  6.   IF(($pos = 0) & ($_xmouse > $_xmax-250) & ($_ymouse > $_ymax-180) & ($_ymouse < $_ymax-70))
  7.      LOGSHOW (1, 0, $_ymax-70-110)
  8.      $pos = $pos^1
  9.   END_IF
  10.   IF(($pos = 1) & ($_xmouse < 250) & ($_ymouse > $_ymax-180) & ($_ymouse < $_ymax-70))
  11.      LOGSHOW (1, $_xmax-250, $_ymax-180)
  12.      $pos = $pos^1
  13.   END_IF
  14.   WAITMS(30)
  15. END_THREAD
  16.  
  17. THREAD(SCREEN, 1)
  18.   GETSCREEN
  19.   LOGCLEAR
  20.   LOGWRITE ("X,Y: ", $_xmouse, ",", $_ymouse)
  21.   LOGWRITE ("Цвет: ",PXL($_xmouse,$_ymouse))
  22.   LOGWRITE ("hWND: ", HGET($_xmouse,$_ymouse))
  23.   WAITMS(200)
  24. END_THREAD
  25.  
  26. WHILE(1)
  27.   WAIT(3600)
  28. END_CYC
Название: Re: Потоки
Отправлено: АНТИКЛАН от Февраль 12, 2015, 03:18:12 am
Могут ли потоки повесить целевую программу?
Если в потоке уже есть задержки обязательно ли ставить задержку перед END_THREAD?

Просто у меня при работе скрипта с потоками зависает игра и закрывается если постоянно не держать включенным скрипт то все нормально.
Название: Re: Потоки
Отправлено: Vint от Февраль 12, 2015, 09:39:30 am
Если в потоке уже есть задержки обязательно ли ставить задержку перед END_THREAD?
А при чём здесь END_THREAD? Если в потоке есть задержки и они там работают, то зачем?
А если они у тебя внутри условий которые могут и не выполнится, то нужно добавить в вариант ELSE или дополнительно.
Название: Re: Потоки
Отправлено: АНТИКЛАН от Февраль 12, 2015, 07:46:44 pm
Могут, по сути поток отдельный кликер, участвующий в распределнии вычислительных ресурсов компьютера с другими потоками и стороними программами.
К примеру тут отдельные товарищи запускали 5 потоков и в каждом раз 20 в секунду делали обновление буфера и цветокорекцию, а потом удивлялись почему иногда тормозит. Каждый скрипт можно оптимизировать и ускорить, зная его недостатки и имея желание тратить силы и время на отладку-доводку и так " работающего" скрипта.

Есть ли уже готовые методы оптимизации. Не хотелось бы тратить время на открытие Америки заного... :)

А при чём здесь END_THREAD? Если в потоке есть задержки и они там работают, то зачем?
А если они у тебя внутри условий которые могут и не выполнится, то нужно добавить в вариант ELSE или дополнительно.

А если внутри цикла который выполняется всегда при запуске потока?
Название: Re: Потоки
Отправлено: АНТИКЛАН от Февраль 14, 2015, 07:30:50 pm
Тут речь действительно об открытии Омерики.
Скрипт принято вначале написать, а потом проанализировать работоспособность и оптимизировать.
Оптимизировать обстрактные потоки,  слишком расплывчатая задача.

А если внутри цикла не ставить задержек, то он способен повесить программу и без потоков.

Мне кажется ты неверно определил основную проблему, эта строка говорит, что у тебя учтены не все ситуации возможные при работе скрипта. По описанию похоже на падение плагина браузерки, клиентские игры гораздо менее склонны закрываться по пустякам. Решай свою конкретную, маленькую задачу, зачем раздувать её до "Общих вопросов" в теме "Учебные Статьи"?

Хорошо
Название: Re: Потоки
Отправлено: Passion от Февраль 25, 2015, 10:17:15 pm
Спасибо, этот теперь работает. Но только если делать окно активным, а если вместо WNDBUMP поставить HSET - то снова не работает. Мне из 2х и более окон одновременно нужно скопировать информацию в 1 окно.

Я не понял... Ты отдельные потоки хочешь привязать к разным окнам в одном скрипте чтоли? Я конечно вообще не в курсе, но мне кажется, что к окну у нас привязывается не скрипт, а сам кликер. То есть, внутри кликера макрос не сможет разные потоки привязать к разным окнам.

Пока не было потоков, у меня был отлично работающий скрипт на 7 окон:
$HW_Bot_A=459570
$HW_Bot_B=263596
$HW_Bot_C=132600
$HW_Bot1=132662
$HW_Bot2=263632
$HW_Bot3=460248
$HW_Bot4=31197714

hset($HW_Bot_A, 1) //         3 min
#include "Bot_A_fast.cms"
hset($HW_Bot_B, 1) //       4 min
#include "Bot_B_shifted_farming.cms"
hset($HW_Bot_C, 1) //   3 min
#include "Bot_C_shifted_farming.cms"
hset($HW_Bot1, 1) //       2.5 min
#include "cylon003_shifted_bot1.cms"

for($var=0, $var < 17)
//hset($HW_Bot1, 1)
//#include "lucky_wheel_1.cms"
hset($HW_Bot2, 1)
#include "lucky_wheel_1.cms"
hset($HW_Bot3, 1)
#include "lucky_wheel_1.cms"
hset($HW_Bot4, 1)
#include "lucky_wheel_1.cms"
waitms(7000)
end_cyc
4 бота делали каждый своё действие (фармили) и 3 бота крутили рулетку. У всех временные задержки разные. Каждый "работал" в своём окне, но делалось это всё последовательно и никаких пересечений не было. С появлением потоков и заявлением, что они по-сути как несколько запущенных кликеров, хочу уточнить, возможно ли реализовать работу через потоки с более тонкой настройкой временных интервалов. Понятно, что если они не совпадают (времена), то пересечения будут и потоки(ака кликеры) будут слать команды каждый в своё окно. Насколько эти радужные мечты реальны ?
На всякий случай приведу код 1 include:
$x1_shift=5
$y1_shift=0
$x2_shift=0
$y2_shift=0
$x3_shift=0 //close mailbox, instance #,
//наводимся по MyTools 1300, 835 - итог 45, 80 x1, y1
//наводимся по EZ rewards 295 255 - итог -65, 10 x2, y2
$xx=900+$x3_shift //предполагаю, что как "close mailbox"
$yy=420+$y2_shift //
  LCLICK($xx,$yy) //OK na vsyakih druzei
waitms(150)
$xx=1065+$x3_shift //предполагаю, что как "close mailbox"
$yy=580+$y2_shift //
  LCLICK($xx,$yy) //close combat message
waitms(500)
  LCLICK(1160,755) //zapravka
waitms(1000)
  LCLICK(1160,665) //zapravka
waitms(1000)
  LCLICK(680,200) //zapravka
waitms(1000)
  LCLICK(1050,200) //zapravka
waitms(500)
$xx=365+$x2_shift //300 x2
$yy=300+$y2_shift //310 y2
  LCLICK($xx,$yy) //EZ rewards
waitms(500)
$xx=1255+$x1_shift //1300 x1
$yy=755+$y1_shift //835 y1
  LCLICK($xx,$yy) //mytools
waitms(1000)
$xx=1255+$x1_shift //1300 x1
$yy=685+$y1_shift //770 y1
  LCLICK($xx,$yy) //mailbox
waitms(1000)
$xx=800//+$x_shift //800 0
$yy=310+$y2_shift //320 y2
  LCLICK($xx,$yy) //last mess
waitms(3500)
$xx=965//+$x_shift //965 0
$yy=575+$y2_shift //585 y2
  LCLICK($xx,$yy) //get all
waitms(500)
$xx=580//+$x_shift //580 0
$yy=575+$y2_shift //585 y2
  LCLICK($xx,$yy) //delete last message
waitms(500)
$xx=1158+$x3_shift //1147 x3
$yy=132+$y_shift //142 y2
  LCLICK($xx,$yy) //close mailbox
waitms(1000)
$xx=355+$x2_shift //290 x2
$yy=245+$y2_shift //255 y2
  LCLICK($xx,$yy) //tutorials
waitms(1000)
$xx=1115//+$x_shiftr //1120 0
$yy=290+$y2_shift //300 y2
  LCLICK($xx,$yy) //instances
waitms(1000)
$xx=600//+$x_shift //600 0
$yy=165+$y2_shift //175 y2
  LCLICK($xx,$yy) //normal
waitms(1000)
//  LCLICK(585,510) //10 instance
//  LCLICK(640,485) //12 instance
//  LCLICK(760,555) //14
// 705,355 - #7
//  LCLICK(695,425) //15
//  LCLICK(815,220) //19 instance
// 840, 285 //22 instance
// 810, 550 //27
// 880, 430 //28
// 888, 560 //30 instance
$xx=840+$x3_shift //870 x3
$yy=285+$y2_shift //440 y2
  LCLICK($xx,$yy) //selected instance
waitms(1000)
$xx=1040//+$x_shift //1040 0
$yy=235+$y2_shift //245 y2
  LCLICK($xx,$yy) //increase fleet
waitms(4000)
$xx=700//+$x_shift // 0
$yy=280+$y2_shift //290 y2
  LCLICK($xx,$yy) // #1
waitms(500)
$xx=870//+$x_shift // 0
$yy=280+$y2_shift //290 y2
  LCLICK($xx,$yy) // #2
waitms(500)
$xx=1060//+$x_shift // 0
$yy=280+$y2_shift //290 y2
  LCLICK($xx,$yy) // #3
waitms(500)
$xx=700//+$x_shift // 0
$yy=380+$y2_shift //390 y2
  LCLICK($xx,$yy) // #4
waitms(500)
$xx=870//+$x_shift // 0
$yy=380+$y2_shift //390 y2
  LCLICK($xx,$yy) //$5
waitms(500)
$xx=1060//+$x_shift // 0
$yy=380+$y2_shift //390 y2
  LCLICK($xx,$yy) //#6
waitms(500)
$xx=700//+$x_shift // 0
$yy=480+$y2_shift //390 y2
  LCLICK($xx,$yy) // #7
waitms(500)
$xx=870//+$x_shift // 0
$yy=480+$y2_shift //390 y2
  LCLICK($xx,$yy) //#8
waitms(500)
$xx=1090//+$x_shift //1090 0
$yy=575+$y2_shift //585 y2
  LCLICK($xx,$yy) //OK - podtverzhdaem commanderov
waitms(1000)
$xx=1040//+$x_shift //1040 0
$yy=190+$y2_shift //200 y2
  LCLICK($xx,$yy) //start instance

И ещё вопрос по горячим кнопкам. Хотел бынастроить запуск и остановку разныз потоков на кнопках :)
Например, мне надо при работе остальных потоков что-то выполнить в первом. Я его останавливаю, делаю внутри-игровые действия, а остальные при этом продолжают нажимать кнопки, как ни в чём не бывало... Когда закончу делать свои дела - запускаю обратно остановленный поток.
Такое сейчас возможно ?
Искал в новом хелпе про горячие кнопки, но ничего подобного не нашёл...
Спасибо за пояснения.
Вячеслав.
Название: Re: Потоки
Отправлено: Oraven от Февраль 25, 2015, 10:32:04 pm
Потоки пока еще очень сырые.
GETSCREEN не изолирован.
Переменные не изолированы.
Привязка одна на весе потоки.
Поток возможно поставить на паузу, но нельзя перезапустить.

Короче что то не сложное можно запихнуть в поток, но пытаться распихать 4 скрипта по потокам и чтоб все работало как 4 кликера пока рано.

Будем ждать дальнейших улучшений потоков.
Название: Re: Потоки
Отправлено: Hito от Март 04, 2015, 02:32:15 pm
Потоки пока еще очень сырые.
GETSCREEN не изолирован.
Переменные не изолированы.
Привязка одна на весе потоки.
Поток возможно поставить на паузу, но нельзя перезапустить.

Короче что то не сложное можно запихнуть в поток, но пытаться распихать 4 скрипта по потокам и чтоб все работало как 4 кликера пока рано.

Будем ждать дальнейших улучшений потоков.

+
Название: Re: Потоки
Отправлено: KERK от Апрель 03, 2015, 12:19:30 pm
Доброго времени суток!
У меня два окна оба полностью помещаются на рабочем столе. В кликере два потока один на одно окно второй на второе все работает нормально!
Вопрос!
Правильно я понял что возможности щас нет привязать каждый поток к своему окну чтобы в это время можно было работать на компьютере? Или есть такая возможность или это как то можно обойти другими способами?
Требуется: два окна в каждом происходят свои действия и в этот момент например работать в интернете.
Заранее спасибо за ответ!
Название: Re: Потоки
Отправлено: Oraven от Апрель 03, 2015, 01:59:19 pm
Пока только поочередная привязка то к одному окну то к другому.
Название: Re: Потоки
Отправлено: NStra от Апрель 03, 2015, 02:06:45 pm
KERK
Да, привязать сразу к двум окнам нельзя.
Например функция Getscreen ,в любом потоке,
будет скриншотить последнее привязанное окно, а не 2-а сразу.
Можно наверное помучиться и сделать чтоб программа поочередно выполняла действия сначала на одном окне, потом на другом, все время привязывая и отвязывая.
Только от потоков в этом случае пользы не будет.

Лучше использовать 2-е программы сразу, вот тебе изолированные потоки.
Название: Re: Потоки
Отправлено: Hito от Апрель 03, 2015, 04:21:18 pm
Например функция Getscreen ,в любом потоке,
будет скриншотить последнее привязанное окно
Всем привет! Я че-то не понял... Пока меня не было, сделали таки, чтобы кликер в привязке экран видел? ))
Название: Re: Потоки
Отправлено: NStra от Апрель 03, 2015, 04:29:44 pm
$N=WNDFIND ("screens")
HSET($N,1)
GETSCREEN
SCREENSHOT
HALT
Result:
Название: Re: Потоки
Отправлено: Hito от Апрель 03, 2015, 04:41:50 pm
А - ну эт понятно! Я сейчас на игре попробовал - не видит... ))
Название: Re: Потоки
Отправлено: agrx от Апрель 03, 2015, 05:15:59 pm
Можно ли выполнять скрипт на несколько окон при помощи потоков? Или придется запускать несколько копий программы и  в каждой выбирать свой процесс?
Название: Re: Потоки
Отправлено: Hito от Апрель 03, 2015, 09:12:27 pm
Можно ли выполнять скрипт на несколько окон при помощи потоков? Или придется запускать несколько копий программы и  в каждой выбирать свой процесс?
Ну чуток выше глаза подними и прочитай...
Название: Re: Потоки
Отправлено: KERK от Апрель 03, 2015, 11:22:12 pm
KERK
Да, привязать сразу к двум окнам нельзя.
Например функция Getscreen ,в любом потоке,
будет скриншотить последнее привязанное окно, а не 2-а сразу.
Можно наверное помучиться и сделать чтоб программа поочередно выполняла действия сначала на одном окне, потом на другом, все время привязывая и отвязывая.
Только от потоков в этом случае пользы не будет.

Лучше использовать 2-е программы сразу, вот тебе изолированные потоки.

Две программы эт хорошо я примерно так и попробовал но если в одном кликере делаю привязку к окну и все прекрасно работает я делаю прозрачность 0 и не мешает работаю на компе а он клацает. Вот со вторым окном проблема) запускаю второй кликер меняю комбинацию чтоб не совпадало с первым кликером (если в первом Alt+ то во втором ставлю Ctrl+) Если второй кликер привязываю ко второму окну то работать не хочет) Без привязки работает. (координаты в привязанном состоянии свои, отвязанном состоянии свои)
Приходится когда комп нужен ставить в одно окно одним кликером с привязкой а когда свободен ставлю двумя потоками на два окна.

А - ну эт понятно! Я сейчас на игре попробовал - не видит... ))

Не знаю но у меня BlueStacks видит и привязывается без проблем. Может я не пользуюсь теми функциями что не видит но пока все что мне надо в привязки видит и делает.

Можно ли выполнять скрипт на несколько окон при помощи потоков? Или придется запускать несколько копий программы и  в каждой выбирать свой процесс?

Как писал выше у меня работает в одном кликере два потока в разных окнах делается свой поток но окна размещены рядом друг с другом на рабочем столе. Один недостаток в это время на компе ничего делать не получается))
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 15, 2015, 02:57:36 am
Можно ли программно из скрипта получать информацию о состоянии потока вкл/выкл? Если да, то как?
Название: Re: Потоки
Отправлено: Hito от Ноябрь 15, 2015, 03:38:51 am
Можно ли программно из скрипта получать информацию о состоянии потока вкл/выкл? Если да, то как?

(http://f6.s.qip.ru/SNS8HTNU.png)
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 15, 2015, 02:22:39 pm
дело в том, что в большенстве случаев этого ненужно, гораздо проще когда поток должен быть включён посылать команду на его включение независимо от состояния потока и выключать соответствующим образом, даже если он уже на паузе. Но, как известно "Охота , пуще неволи!"
Код: Clickermann
  1. THREAD(thr_name2)  
  2.  
  3.   IF(iskeydown(#F2)=1)
  4.      BEEP(800,200)
  5.      WHILE(iskeydown(#F2)=1)
  6.         WAITMS(100)
  7.      END_CYC
  8.      IF($_stop = 0)
  9.         IF($hint = 6)
  10.            HINTPOPUP(" ","пауза")
  11.         END_IF
  12.         SETTHREAD (thr_name1,0)
  13.         SETTHREAD (thr_name,0)
  14.         INC($_stop,1)
  15.      ELSE
  16.         IF($hint = 6)
  17.            HINTPOPUP(" ","продолжить")
  18.         END_IF
  19.         logwrite("продолжить")
  20.         SETTHREAD (thr_name1, 1)
  21.         SETTHREAD (thr_name, 1)
  22.         INC($_stop,-1)
  23.         $time593 = 0
  24.      END_IF
  25.   END_IF
  26.   IF(($_stop = 1)&($time593 < $_time_t))
  27.      IF($hint = 6)
  28.         HINTPOPUP(" ","включена пауза")
  29.         $time593 = $_time_t + 45
  30.      END_IF
  31.   END_IF
  32.  
  33. END_THREAD
  34.  
в потоке проверяется нажатие клавиши F2 первое нажатие ставит два других потока на паузу, второе продолжить работу. если пауза включена и сообщения в трей разрешены в настройках то выводится сообщение HINTPOPUP(" ","включена пауза") если состояние потоков нужно узнать програмно, то всегда можно обратиться к значению переменной $_stop

$_stop это зарезервированная переменная? Если да то где вы о ней информацию нашли? В документации она вроде не описана в списке зарезервированных переменных. И еще. Её можно проверять только из проверяемого потока или из любого места? Если из любого, то как проверить нужную переменную если потоков несколько?
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 15, 2015, 02:36:36 pm
Что происходит при включении включенного потока и выключении выключенного?

Код: Clickermann
  1. START:
  2.  
  3. SETTHREAD (THREAD_NAME, 1)
  4. WAITMS(5)
  5.  
  6. GOTO(START)
Код: Clickermann
  1. START:
  2.  
  3. SETTHREAD (THREAD_NAME, 0)
  4. WAITMS(5)
  5.  
  6. GOTO(START)
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 15, 2015, 05:25:59 pm
$_stop  - обычная переменная, название может быть любым. проверять и изменять можно в любом потоке, ограничений нет.

А ну так я тоже могу. Я думал вы нашли что-то внутри языка кликермана. :D

Что происходит при включении включенного потока и выключении выключенно?

НИЧЕГО.
Код: Clickermann
  1. THREAD(thr_name1)
  2.   LOGWRITE ("1поток включен")
  3.   // тело потока    
  4.   waitms(3000)
  5. END_THREAD
  6.  
  7. THREAD(thr_name2)
  8.   LOGWRITE ("2поток включен")
  9.   // тело потока    
  10.   waitms(3000)
  11. END_THREAD
  12.  
  13. LOGWRITE ("команда включить 1 поток")
  14. SETTHREAD (thr_name1, 1)
  15. WAIT(2)
  16.  
  17. LOGWRITE ("команда вЫключить 2 поток")
  18. SETTHREAD (thr_name2, 0)
  19. WAIT(2)
  20.  

Я спрашивал не как включить/выключить поток, а как работает сам механизм включения/выключения внутри кликермана. :D
Название: Re: Потоки
Отправлено: Hito от Ноябрь 15, 2015, 08:23:52 pm
Я спрашивал не как включить/выключить поток, а как работает сам механизм включения/выключения внутри кликермана. :D

Странный вопрос... "Механизм" выполняет команды, прописанные в скрипте. Как любая программа...
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 16, 2015, 04:19:45 am
Странный вопрос... "Механизм" выполняет команды, прописанные в скрипте. Как любая программа...

Конкретно меня интересует, если поток уже запущен и приходит команда на его запуск что делает кликер? Тупо перезапускает его или проверяет и оставляет в покое ничего не делая? Как сильно могут сказаться постоянные перезапуски потоков на производительности? Я просто ввожу в свои скрипты возможности автоматического включения/отключения функций при разных условиях и мне необходимо знать такие нюансы которые я описал.
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2015, 05:57:22 am
Конкретно меня интересует, если поток уже запущен и приходит команда на его запуск что делает кликер? Тупо перезапускает его или проверяет и оставляет в покое ничего не делая?

Ну, если ты сам это проверить за 5 минут не в состоянии и вместо этого, готов сутками ждать ответа на форуме, то наверное кодинг не для тебя...

https://www.youtube.com/watch?v=Wv3wAKfdaX8&feature=youtu.be (https://www.youtube.com/watch?v=Wv3wAKfdaX8&feature=youtu.be)

Вывод сам сделаешь, или помочь...?
Но учти вот эту тему - http://crapware.aidf.org/forum/index.php?topic=1986.msg11881#msg11881 (http://crapware.aidf.org/forum/index.php?topic=1986.msg11881#msg11881)
Название: Re: Потоки
Отправлено: Vint от Ноябрь 16, 2015, 10:31:08 am
Конкретно меня интересует, если поток уже запущен и приходит команда на его запуск что делает кликер? Тупо перезапускает его или проверяет и оставляет в покое ничего не делая? Как сильно могут сказаться постоянные перезапуски потоков на производительности? Я просто ввожу в свои скрипты возможности автоматического включения/отключения функций при разных условиях и мне необходимо знать такие нюансы которые я описал.
Перезапуска нет. Команда просто игнорируется.
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 16, 2015, 10:32:03 am
Это не команда на запуск а скорее переключатель 0 - не работает, 1 - работает.
К сожалению пока потоки нельзя перезапускать а только ставить на паузу.
Название: Re: Потоки
Отправлено: АНТИКЛАН от Ноябрь 16, 2015, 08:12:21 pm
Перезапуска нет. Команда просто игнорируется.

Вот это я и хотел узнать. :D
Название: Re: Потоки
Отправлено: Hito от Ноябрь 16, 2015, 08:25:49 pm
Vint, Oraven - здорово, парни! Даж соскучился по этому форуму...)) А почему пауза запускает даже те потоки, которые не включены? Я уже молчу о том, что при паузе потоки перезапускаются... Это никак не лечится?
Название: Re: Потоки
Отправлено: Oraven от Ноябрь 16, 2015, 09:48:07 pm
Vint, Oraven - здорово, парни! Даж соскучился по этому форуму...)) А почему пауза запускает даже те потоки, которые не включены? Я уже молчу о том, что при паузе потоки перезапускаются... Это никак не лечится?

Действительно, очевидно лечится не использованием паузы. Как то надо выкручиваться...
Название: Re: Потоки
Отправлено: Victor от Февраль 01, 2016, 12:15:54 pm
Был вопрос

Ноябрь 03, 2014, 04:11:49 pm »

Здравствуйте! Есть 2 потока, у каждого после его работы свой период ожидания, подскажите, можно ли сделать, чтобы если у одного из них вышел назначенный период ожидания, а в это время совершает какую-то работу другой, первый чтоб продлил свое ожидание, дождался когда другой дойдет до своего wait(...),  и только тогда делал свои действия.


БЫЛ ОТВЕТ.

А смысл тебе тогда потоки делать?


Код: Clickermann
1.IF($time1 < $_time_t)
2.   // условие сработает снова через 60 сек
3.
4.   $time1 = $_time_t + 60
5.END_IF
6.
7.IF($time2 < $_time_t)
8.   // условие сработает снова через 2 минуты
9.
10.   $time2 = $_time_t + 120
11.END_IF
12.
13.WAIT(1)


А нельзя ли поподробнее.
1) Имеется три разные задачи которые кликаются в одной веб игре.(на одном экране)
2) Время запуска задач не постоянно.
3) Время выполнения задач от 30 секунд до 10 минут.
3) Как сделать что бы эти задачи не пересекались во времени. Но исполнялись с минимальными задержками. С пояснениями пожалуйста(я начинающий)
4) Задачи должны выполняться последовательно.
5) Скрипт зациклен. Выполняется сутками.
Название: Re: Потоки
Отправлено: Oraven от Февраль 01, 2016, 12:48:02 pm
Куда подробнее все и так просто. $_time_t возвращает текущее время Unix в секундах. Вот на этом и создается таймер, а потом в условии сравнивается значение переменной с текущем временем.
Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   // условие сработает снова через 60 сек
  3.  
  4.   $time1 = $_time_t + 60
  5. END_IF
  6.  
  7. IF($time2 < $_time_t)
  8.   // условие сработает снова через 2 минуты
  9.  
  10.   $time2 = $_time_t + 120
  11. END_IF
  12.  
  13. IF($time3 < $_time_t)
  14.   // условие сработает снова через 10 минут
  15.  
  16.   $time3 = $_time_t + 600
  17. END_IF
  18.  
  19. WAITMS(50)
Название: Re: Потоки
Отправлено: Victor от Февраль 01, 2016, 01:25:29 pm
Спасибо буду пробовать :)
Название: Re: Потоки
Отправлено: Victor от Февраль 01, 2016, 03:12:04 pm
Что то не так.

Обьясните мне пожалуйста



1.IF($time1 < $_time_t)

2.   // условие сработает снова через 60 сек

3.  // что будет если условие выполняется больше 60 сек

4.   $time1 = $_time_t + 60

5.END_IF

6.

7.IF($time2 < $_time_t)

8.   // условие сработает снова через 2 минуты

9.
10.   $time2 = $_time_t + 120

11.END_IF



12.

13.IF($time3 < $_time_t)

14.   // условие сработает снова через 10 минут

15. //что будет если этому условию время выполняться, а 2 условие еще работает


16.   $time3 = $_time_t + 600

17.END_IF




Извините может глупо, но не пойму почему у меня не работает.
Название: Re: Потоки
Отправлено: Vint от Февраль 01, 2016, 03:29:48 pm
Скрипт выполняется последовательно.
В данном случае на "верхнем" уровне в нём всего лишь три условия проверяющие не вышел ли таймер.
Если при проверке очередного IF таймер вышел будет выполняться тело условия. Пока оно не завершится и из условия не выйдем.

3.  // что будет если условие выполняется больше 60 сек
Будет выполняться столько сколько ему нужно.

Цитировать
15. //что будет если этому условию время выполняться, а 2 условие еще работает
как работало 2 так и будет работать. Скрипт вообще не узнает о том, что  "этому условию время выполняться", пока работа скрипта до него не дойдёт.

Ты же хотел:
Цитировать
3) Как сделать что бы эти задачи не пересекались во времени.
4) Задачи должны выполняться последовательно.

Извините может глупо, но не пойму почему у меня не работает.
"Не работает" слишком пространное объяснение. Что именно не работает? Не срабатывает по времени определённое условие? Наоборот, срабатывает не тогда когда нужно?

Что внутри этих условий? Может проблема "не работы" там?
Название: Re: Потоки
Отправлено: Victor от Февраль 01, 2016, 03:55:40 pm
Попробую обьяснить задачу, не силен я в программировании. Поэтому пишу ПОПРОБУЮ ОБЬЯСНИТЬ.

1) три процесса на одной веб игре. (должны выполнятся не пересекаясь во времени потому что интерфейс игры один а расположение кнопок на разных страницах разное)

2) 1й процес время исполнения кода 30сек, время ожидания завершения его в игре 3ч 20сек
    2й процес время исполнения кода 540сек, время ожидания завершения его в игре от 1ч 20 мин до 2ч 10мин
    3й процес время исполнения кода 60сек, время ожидания завершения его в игре 1ч 30мин

3)как сделать так что бы друг из за друга они не пропускали свои рабочие циклы.(не мешали друг другу)
   ну и попросту не тыкались в один и тот-же экран два разных процесса.

Пс. По отдельности все работает.
      Сейчас работает два скрипта через THREAD, в конце сприптов стоят WAIT.
      Беда в том что когда они пересекаются во времени, они мешают друг другу.

Ты же хотел:

Цитировать

3) Как сделать что бы эти задачи не пересекались во времени.
4) Задачи должны выполняться последовательно.

Да, но у каждого скрипта свое время исполнения( я имею ввиду с завершением в игре) и более короткие задачи меняются местами по времени старта с более длинными. можно как то мониторить этот процесс(переназначать их очередность в запуске или активность в потоках и регулярно их перезапускать исходя из этого).


Название: Re: Потоки
Отправлено: Oraven от Февраль 01, 2016, 04:14:04 pm
Не понимаю в чем твоя проблема?

Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   // условие сработает снова через 3часа 20 сек
  3.   // 1й процес время исполнения кода 30сек
  4.   $time1 = $_time_t + 10820
  5. END_IF
  6.  
  7. IF($time2 < $_time_t)
  8.   // условие сработает снова через 1 час 20 мин
  9.   // 2й процес время исполнения кода 540сек
  10.   // с "до 2ч 10мин" сложнее. Нужно вставить проверку завершилось ли задание, если нет то выставить ожидание в несколько секунд а не часов.
  11.   $time2 = $_time_t + 4800
  12. END_IF
  13.  
  14. IF($time3 < $_time_t)
  15.   // условие сработает снова через 1 час 30 мин
  16.   // 3й процес время исполнения кода 60сек
  17.   $time3 = $_time_t + 5400
  18. END_IF
  19.  
  20. WAITMS(50)
Название: Re: Потоки
Отправлено: Vint от Февраль 01, 2016, 04:14:46 pm
Делать то же что ты и делаешь руками.
Вот что делаешь, если выполняешь процесс 2 длительностью 9 мин, а в это время наступило время делать 3?

Про очерёдность ты должен сам решить что для тебя важней. Твою игру никто не знает, кроме тебя.
Название: Re: Потоки
Отправлено: Victor от Февраль 01, 2016, 04:21:01 pm
 :) Огромное спасибо.
Все обьяснили. Буду делать и надеюсь ума хватит все допилить.
Название: Re: Потоки
Отправлено: Vint от Февраль 01, 2016, 04:26:01 pm
Хорошо "объяснение". Три раза повторили одно и то же  :D ;D
Название: Re: Потоки
Отправлено: Золотой от Февраль 01, 2016, 04:31:11 pm
:) Огромное спасибо.
Все обьяснили. Буду делать и надеюсь ума хватит все допилить.
осторожней там с умом, от него иногда горе бывает, смотри не перепили! ;)
Название: Re: Потоки
Отправлено: АНТИКЛАН от Февраль 07, 2016, 06:14:52 am
Хорошо "объяснение". Три раза повторили одно и то же  :D ;D

Повторение — мать учения! :D
Название: Re: Потоки
Отправлено: i0 от Февраль 08, 2016, 09:53:14 am
заметка из личного опыта

если поток ищет на экране картинки, лучше избегать в нём использования IF_PICTURE_IN и IF_PIXEL_IN (возвращающих результат в глобальные $_return1 и $_return2), заменив на SCANPICTURE и SCANPXL соответственно.
Название: Re: Потоки
Отправлено: i0 от Февраль 08, 2016, 10:32:15 am
мне проще в мелких потоках обходить эти переменные стороной, чем в основном потоке с десятками ифпикчаинов сохранять переменные каждый раз

+не на 100% уверен, что два события не могут совпасть.
Название: Re: Потоки
Отправлено: Victor от Апрель 16, 2016, 07:55:18 pm
Доброго времени суток, подскажите пожалуйста как в данный скрипт
IF($time1 < $_time_t)
   // условие сработает снова через 3часа 20 сек
   // 1й процес время исполнения кода 30сек
   $time1 = $_time_t + 10820
END_IF
 
IF($time2 < $_time_t)
   // условие сработает снова через 1 час 20 мин
   // 2й процес время исполнения кода 540сек
   // с "до 2ч 10мин" сложнее. Нужно вставить проверку завершилось ли задание, если нет то выставить ожидание в несколько секунд а не часов.
   $time2 = $_time_t + 4800
END_IF
 
IF($time3 < $_time_t)
   // условие сработает снова через 1 час 30 мин
   // 3й процес время исполнения кода 60сек
   $time3 = $_time_t + 5400
END_IF
 
WAITMS(50)


в одно из "IF" вставлять, по истечении времени ожидания, на выполнение новый файл(.cms)
имеется 10 скриптов, (1, 2, 3, 4, 5, 6, 7, 8, 9,10 -.cms)
нашел #include, но не пойму он вес скрипт на себя заменит или только то что между IF и END_IF.
и не пойму как сделать чтобы каждый новый раз он новый файл грузил.
Подскажите пожалуйста.
Название: Re: Потоки
Отправлено: Oraven от Апрель 17, 2016, 10:55:52 am
За место #include "1.cms" будет вставлено то что находится в файле 1.cms
Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   INC($n,1)
  3.   SWITCH($n)
  4.   CASE(1)
  5.      #include "1.cms"
  6.   CASE(2)
  7.      #include "2.cms"
  8.   CASE(3)
  9.      #include "3.cms"
  10.   CASE(4)
  11.      #include "4.cms"
  12.   CASE(5)
  13.      #include "5.cms"
  14.   CASE(6)
  15.      #include "6.cms"
  16.   CASE(7)
  17.      #include "7.cms"
  18.   CASE(8)
  19.      #include "8.cms"
  20.   CASE(9)
  21.      #include "9.cms"
  22.   CASE(10)
  23.      #include "10.cms"
  24.   DEFAULT
  25.   END_SWITCH
  26.   IF($n = 10)
  27.      $n = 0
  28.   END_IF
  29.   $time1 = $_time_t + 10820
  30. END_IF
Название: Re: Потоки
Отправлено: Victor от Апрель 17, 2016, 10:17:34 pm
 ::)Спасибо.
Название: Re: Потоки
Отправлено: Vint от Апрель 18, 2016, 10:02:39 am
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
Название: Re: Потоки
Отправлено: dramster от Апрель 18, 2016, 09:37:04 pm
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\
Название: Re: Потоки
Отправлено: Oraven от Апрель 18, 2016, 09:45:37 pm
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\

Не так будет при типичном нубском использовании #include. Скажем одно и тоже вставляется несколько раз, а там и ГОТО с метками и возможно подпрограммы. Такое нельзя дублировать!

Правильное использование #include, весь код в прилагаемом файле заключен в подпрограмму, с верху в основном скрипте пишется этот #include а ниже, где требуется вызовы.

Название: Re: Потоки
Отправлено: Vint от Апрель 19, 2016, 08:58:42 am
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\
Конечно работают, для этого они и предназначены.
Но вот здесь уже работать не будут
Код: Clickermann
  1. SUB(name1)
  2.   #include "mylib.cms"
  3. END_SUB
Если в mylib.cms есть подпрограммы или потоки. Потому что include закопан в тело другой подпрограммы, что делать нельзя. Правильно делать так
Код: Clickermann
  1. #include "mylib.cms"
  2. SUB(name1)
  3.   name2() // вызов ПП из mylib.cms
  4. END_SUB
Все инклюды в корне скрипта.
Название: Re: Потоки
Отправлено: Victor от Август 04, 2016, 01:48:05 pm
Всем добрый день. ;)
Появился новый вопрос. ;)

Возможно ли  $time2 = $_time_t + 120 указать ему не +120 а время которое в include пропиисано как время простоя.
Ну и естественно там его описать так чтобы оно не влияло на временной простой самого include.

Попробую уточнить бо сам не пойму поймете ли вы меня.
когда исполняется END_IF он берет на исполнение  разные include в которых разное время простоя, хотелось бы что бы после исполнения  include,  END_IF брал время которое описано в последнем исполняемом include и присваивал его ка время простоя. ::)


IF($time2 < $_time_t)
   // условие сработает снова через 2 минуты
 
   $time2 = $_time_t + 120
END_IF
Название: Re: Потоки
Отправлено: Vint от Август 04, 2016, 03:16:48 pm
...END_IF брал время...
END_IF в принципе ничего не берёт, это знак окончания блока IF

после исполнения  include
Где в примере эти include? Как они прописаны? В них код в подпрограммах?
Потому что с include тут такое вытворяют, что на голову не наденешь.

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

Код: Clickermann
  1. $downtime = 120

Все переменные глобальны. Код из всех include вставляется на место, где прописано подключение.
Примерно так:
Код: Clickermann
  1. // код в 1.cms
  2. SUB(подпр_1)
  3.    // ...
  4.    $downtime = 120 // время простоя выставляем 120
  5. END_SUB
  6.  
  7. // код в 2.cms
  8. SUB(подпр_2)
  9.    // ...
  10.    $downtime = 30 // время простоя выставляем 30
  11. END_SUB
  12.  
  13.  
  14. // основной скрипт
  15. #include "1.cms"
  16. #include "2.cms"
  17. IF($time2 < $_time_t)
  18.    // ...
  19.    IF($n = 3)
  20.        подпр_1()
  21.    ELSE
  22.        подпр_2()
  23.    END_IF
  24.    // ...
  25.    $time2 = $_time_t + $downtime
  26. END_IF

Название: Re: Потоки
Отправлено: Victor от Август 04, 2016, 03:57:21 pm
Спасибо сегодня вечером попробую :)
Название: Re: Потоки
Отправлено: Victor от Август 04, 2016, 04:52:28 pm
Я так понимаю, если это

Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   INC($n,1)
  3.   SWITCH($n)
  4.   CASE(1)
  5.      #include "1.cms"
  6.   CASE(2)
  7.      #include "2.cms"
  8.   CASE(3)
  9.      #include "3.cms"
  10.   CASE(4)
  11.      #include "4.cms"
  12.   CASE(5)
  13.      #include "5.cms"
  14.   CASE(6)
  15.      #include "6.cms"
  16.   CASE(7)
  17.      #include "7.cms"
  18.   CASE(8)
  19.      #include "8.cms"
  20.   CASE(9)
  21.      #include "9.cms"
  22.   CASE(10)
  23.      #include "10.cms"
  24.   DEFAULT
  25.   END_SWITCH
  26.   IF($n = 10)
  27.      $n = 0
  28.   END_IF
  29.   $time1 = $_time_t + $downtime
  30. END_IF
  31.  
  32.  

Вставить сюда

Код: Clickermann
  1. IF($time1 < $_time_t)
  2.   // условие сработает снова через 60 сек
  3.  
  4.   $time1 = $_time_t + 60
  5. END_IF
  6.  
  7. IF($time2 < $_time_t)
  8.   // условие сработает снова через 2 минуты
  9.  
  10.   $time2 = $_time_t + 120
  11. END_IF
  12.  
  13. IF($time3 < $_time_t)
  14.   // условие сработает снова через 10 минут
  15.  
  16.   $time3 = $_time_t + 600
  17. END_IF
  18.  
  19. WAITMS(50)
  20.  
  21.  



ПОЛУЧИМ  ЭТО и скрип будет работать.
Проверте пожалуйста ни накосячил ли я где с блоками IF(я их описывал как END_IF).

Код: Clickermann
  1.  
  2. IF($time1 < $_time_t)
  3.   // условие сработает снова через $downtime (описан в поключаемом модуле)
  4.    INC($n,1)
  5.   SWITCH($n)
  6.   CASE(1)
  7.      #include "1.cms"
  8.   CASE(2)
  9.      #include "2.cms"
  10.   CASE(3)
  11.      #include "3.cms"
  12.   CASE(4)
  13.      #include "4.cms"
  14.   CASE(5)
  15.      #include "5.cms"
  16.   CASE(6)
  17.      #include "6.cms"
  18.   CASE(7)
  19.      #include "7.cms"
  20.   CASE(8)
  21.      #include "8.cms"
  22.   CASE(9)
  23.      #include "9.cms"
  24.   CASE(10)
  25.      #include "10.cms"
  26.   DEFAULT
  27.   END_SWITCH
  28.   IF($n = 10)
  29.      $n = 0
  30.   END_IF
  31.   $time1 = $_time_t + $downtime
  32. END_IF
  33.  
  34.  
  35. IF($time2 < $_time_t)
  36.   // условие сработает снова через 2 минуты
  37.  
  38.   $time2 = $_time_t + 120
  39. END_IF
  40.  
  41. IF($time3 < $_time_t)
  42.   // условие сработает снова через 10 минут
  43.  
  44.   $time3 = $_time_t + 600
  45. END_IF
  46.  
  47. WAITMS(50)
  48.  
  49.  


И в итоге я имею три блока IF, из которых два с постоянной задержкой, а один с загр кодом и переменной задержкой.
Неужели победа!!!
Название: Re: Потоки
Отправлено: Vint от Август 04, 2016, 06:24:22 pm
Ну, если в инклюдах будет прописано $downtime=...

Но это не нормальное использование include. Если там есть подпрограммы, то работать не будет.
Название: Re: Потоки
Отправлено: Victor от Август 04, 2016, 07:31:52 pm
В #include имеются только блоки IF(поиск текста по цвету, на веб странице.никаких переходов по строкам кода, все последовательно), что не пойдет работать?  :'(

Напишите пожалуйста как правильно, чувствую что очень просто но сам не соображу :-[
Я так понимаю надо правильно, подключаемый (#include)код оформить. Но как? ::)
Название: Re: Потоки
Отправлено: Vint от Август 05, 2016, 08:33:57 am
Если там есть подпрограммы, то работать не будет.
Что здесь непонятного? Если подпрограмм нет, то всё будет нормально.
Название: Re: Потоки
Отправлено: Victor от Август 05, 2016, 09:14:09 am
Спасибо
Название: Re: Потоки
Отправлено: Victor от Август 05, 2016, 01:57:24 pm
Добрый день.

Вопрос по #include .

Можно ли ему указать путь где он будет брать подгружаемые    *.cms, и как это делается?
В хелпе к кликеру вообще ничего не сказано. :)
Название: Re: Потоки
Отправлено: Vint от Август 05, 2016, 02:23:23 pm
Можно. Но с какой-то версии работают только относительные пути.
#include "Dir\script.cms"
подгружает  скрипт из подпапки Dir из папки проекта

#include "..\Dir\script.cms"
подгружает  скрипт из подпапки Dir лежащей рядом с папкой проекта. Т.е. на уровень вверх + вниз в Dir
Название: Re: Потоки
Отправлено: Victor от Август 05, 2016, 02:25:01 pm
 :) Спасибо
Название: Re: Потоки
Отправлено: Andrij от Июнь 19, 2017, 12:23:05 pm
Сделал два потока и комп зависает
Какие системний требования к железу ?
На что обратиться внимание процесор, озу, видео?
Название: Re: Потоки
Отправлено: Oraven от Июнь 19, 2017, 01:12:01 pm
Сделал два потока и комп зависает
Какие системний требования к железу ?
На что обратиться внимание процесор, озу, видео?

Обрати внимание на задержки в скрипте!
Код: Clickermann
  1. THREAD(t1, 1)
  2.   LOGWRITE ("Поток 1")
  3.   WAITMS(50)
  4. END_THREAD
  5.  
  6. THREAD(t2, 1)
  7.   LOGWRITE ("Поток 2")
  8.   WAITMS(50)
  9. END_THREAD
  10.  
  11. // основной поток
  12. WAIT(1) // тут тоже лучше прописать задержку
Название: Re: Потоки
Отправлено: Andrij от Июнь 19, 2017, 09:44:13 pm
Там все сложнее.
Сделано под браузерную игру откривает два окна и скрипт большои местами задержки от 15 секунд и до наскольких минут.
 Процесор на 100% загружен. Двох ядерний 3.1 на ядро +4 гб озу
Сейчас думаю комп под єто купить но не знаю что вибрать
Название: Re: Потоки
Отправлено: kiril от Июнь 19, 2017, 09:48:34 pm
Там все сложнее.
Сделано под браузерную игру откривает два окна и скрипт большои местами задержки от 15 секунд и до наскольких минут.
 Процесор на 100% загружен. Двох ядерний 3.1 на ядро +4 гб озу
Сейчас думаю комп под єто купить но не знаю что вибрать
Голову под это купи, выложи свой прожорливый скрипт и тебе укажут, где он жрет лишнее и как это лечить.
Название: Re: Потоки
Отправлено: АНТИКЛАН от Август 28, 2017, 09:17:20 am
Там все сложнее.
Сделано под браузерную игру откривает два окна и скрипт большои местами задержки от 15 секунд и до наскольких минут.
 Процесор на 100% загружен. Двох ядерний 3.1 на ядро +4 гб озу
Сейчас думаю комп под єто купить но не знаю что вибрать

Не нужно новый комп. У тебя просто недоработка в скрипте. Где то цикл без задержек шпарит вот и всё.
Название: Re: Потоки
Отправлено: Alexey+ от Сентябрь 30, 2018, 05:42:35 pm
заметка из личного опыта

если поток ищет на экране картинки, лучше избегать в нём использования IF_PICTURE_IN и IF_PIXEL_IN (возвращающих результат в глобальные $_return1 и $_return2), заменив на SCANPICTURE и SCANPXL соответственно.

Я так понял что $_return1 и $_return2 неизолированы. Или я туплю в чем то? Сейчас попробую заменить на SCANPICTURE, хотя это и не совсем удобно (предметов может быть много, немного разных, ищет с вероятностью 80%, будет возвращать кучу координат). Ну и ладно, SCANPICTURE так SCANPICTURE... Возьму одну координатную пару из SCANPICTURE и undefine($var) мне в помощь... Если будет возможность в будущем - изолируйте пожалуйста $_return1 и $_return2