Author Topic: Где реально применяются потоки?  (Read 5028 times)

0 Members and 1 Guest are viewing this topic.

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Где реально применяются потоки?
« on: June 24, 2022, 09:35:20 AM »
Доброго дня всем!

Изучаю кликерманн (очень помогает автоматизировать работу) и много раз встречал потоки.

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

Спасибо за ответ!

Прочитал статью http://crapware.aidf.org/forum/index.php?topic=1491.0 , но так и не понял смысл реального применения
« Last Edit: June 24, 2022, 09:45:45 AM by SimplY »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Где реально применяются потоки?
« Reply #1 on: June 24, 2022, 01:51:52 PM »
Как потоки помогают вам в кликере? Есть реальные примеры, где потоки реально принесли пользу? В чем они помогли?
Если пока не понял, то тебе пока это не нужно. Как появится проблема которую решат потоки, так сразу и узнаешь. Ты узнаешь её из тысячи...
В группе ВК есть товарищи, которые пихают потоки везде, надо это или не надо. Нам с ними не по пути.

Часть примеров есть в справке и в той статье. Если обобщить и оставить только суть, то основных причин применять потоки две:
1. Нам нужно одновременное выполнение двух веток скрипта.
2. Нам нужно иметь возможность прерывать выполнение ветки кода в любом месте, с (или без) последующего перезапуска этого кода.
Чаще, но не всегда, эти причины ходят вместе.

Под "1" подходит пример с клавишами - из статьи. Где нужно нажимать кнопки клавиатуры каждую со своей периодичностью, а ля применение бафов/ударов со временем отката.
Можно сделать на паузах если они маленькие и не критично не точное выполнение периодов, ну будет чуть дольше, чем нужно. Если паузы большие, они будут мешать друг другу сильнее и может стать неприемлим такой подход. Здесь два варианта решения: на таймерах или на потоках. На потоках понятно как это будет выглядеть, плюс код будет меньше и менее сложный. На таймерах, каждому нажатию зададим свой таймер и все эти действия проверяем последовательно в цикле. Чей таймер вышел - то действие и выполняется. Точность меньше, чем на потоках из-за времени проверок и времени срабатываний вышедших таймеров.
Всё хорошо, если у нас действия простые, типа этих нажатий кнопок, а если более продолжительные? Допустим мы в цикле программы ожидаем какие-то признаки и в зависимости от признака выполняем довольно большой кусок кода. Но даже если один из признаков сработал и мы начали выполнять, нам требуется продолжать следить за другими признаками.
Пример -  рыбалка на 2+ снасти. Нужно следить за разными поплавками - это можно делать и последовательно, даже именно лучше последовательно, но при клёве нужно выполнят действия по вылову. Вот действия лучше запускать в отдельном потоке. При этом может начаться клёв на другую снасть и нужно одновременно вылавливать и другой.
Здесь у нас к первой причине присоединяется и вторая.

Всё это сопровождается возможностью включать/отключать отдельные слежения (ветки кода) не городя кучу условий.

Другой пример: в давние времена, когда деревья были большими, а версия кликера маленькой, писал я скрипт на зомби ферму. Скрипт выполнял по кругу очень продолжительные и сложные действия. В основном всё работало нормально в пределах нескольких часов. Но если дольше, флеш сильно сжирал память уставал и начинал падать. Если сбои по причине интернета или браузера были очень редкими и на них писать код проверки было мало смысла, то с этим сбоем надо было решать. Решаем стандартно, следим за каким нибудь постоянным элементом игры который при падении пропадает или проверяем не появилось ли сообщение о падении (сбоев было несколько и каждый нужно ловить по своему). Написал подпрограмму проверки на сбой и при сбое действия по устранению и GOTO на старт скрипта с начала. Теперь вопрос когда и где вызывать эту подпрограмму проверки. Начал раскидывать её максимально по скрипту, внутри больших и средних по продолжительности циклов с действиями, после основных блоков. Мало. Внутри часто использующихся блоков... Стало легче, но полностью вопрос не решило.
Потому, что в скрипте было много циклов ожидания изменений на экране и с необязательным появлением картинки и с обязательным. С необязательным не так критично, а вот с обязательным нужно было добавлять вызов проверки ещё и внутрь всех этих циклов ожидания. Стало всё не очень хорошо и уж совсем не красиво и неудобно. Я до сих пор не уверен не пропустил ли я потенциальные места для проверки.
К тому же простой перезапуск всего скрипта с самого начала не подходил, он был не с самого начала, а после некоторой части инициализаций. К тому же пришлось перешерстить все переменные и задать им начальные значения не полагаясь на значения по умолчанию, ведь после перехода в начало переменные уже были использованы и там хранилось много разных значений которые нужно было сбросить.
Вот когда в кликере появились потоки эту задачу стало гораздо проще реализовать. И работала она намного надёжнее и перезапускала правильней без выпрыгивания по GOTO из десятка подпрограмм и нескольких вложенных циклов.
Вот такие дела.

Ещё пример на 2 причину: управление кнопками типа горячих клавиш. Разные кнопки запускают/останавливают разные части кода. Даже если не нужно их одновременное выполнение, особенно если не нужно!
И если реализовывать без потоков, просто по условиям запуск можно, то с остановкой проблема. Мы даже если вовремя поймаем нажатие кнопки управления (тоже вопрос как это сделать не раскидывая по скрипту капсулы из условий меняющих флаг или выпригивающих по GOTO), то если менять флаг нам всё равно нужно дождаться окончания действия или подпрыгнуть ближе к этому окончанию. С потоками же мы просто останавливаем или приостанавливаем нужный поток и всё.
« Last Edit: June 24, 2022, 02:03:34 PM by Vint »


resident

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Где реально применяются потоки?
« Reply #2 on: July 02, 2022, 02:00:46 PM »
3д шутер, поиск противников на экране по полоске хп.
Полоски бывают разных цветов, другой цвет под логом убийств.
Допустим всего 5 цветов, на поиск одного цвета 100 мс.
Если искать последовательно, то противника можно найти через 500 мс.
Если каждый цвет в отдельном потоке, то максимум через 100 мс.
Плюс в потоках сканируется своё хп и кол-во патронов.
После движения мыши на противника нужно время чтоб персонаж повернулся
Если делать это все в одном потоке, то частота сканирования получается секунда, представьте что вы играете с пингом в секунду
Через потоки информация поступает гораздо быстрее

Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: Где реально применяются потоки?
« Reply #3 on: July 02, 2022, 06:27:43 PM »
Это ваша теория такая или проверено практикой?
дело в том что у НАС противоположно другие практические данные. Пять потоков обновляющие графический буфер программы будут  просто вешать наглухо даже не самый старый комп.
А все команды программа выполняет ПОСЛЕДОВАТЕЛЬНО, даже если они в разных потоках.

resident

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Где реально применяются потоки?
« Reply #4 on: July 02, 2022, 10:17:17 PM »
Зачем в потоках обновлять графический буфер? Буфер обновляется в основном потоке, запускает потоки на анализ, после анализа потоки останавливаются, ждут обновления буфера. Если поток выполняется долго, то он может пропускать обновления буфера.
На счет последовательно и параллельно утверждать не буду, но то что с потоками работает в разы быстрее - факт.

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Re: Где реально применяются потоки?
« Reply #5 on: July 04, 2022, 05:41:12 AM »
Как потоки помогают вам в кликере? Есть реальные примеры, где потоки реально принесли пользу? В чем они помогли?
Если пока не понял, то тебе пока это не нужно. Как появится проблема которую решат потоки, так сразу и узнаешь. Ты узнаешь её из тысячи...
В группе ВК есть товарищи, которые пихают потоки везде, надо это или не надо. Нам с ними не по пути.

Часть примеров есть в справке и в той статье. Если обобщить и оставить только суть, то основных причин применять потоки две:
1. Нам нужно одновременное выполнение двух веток скрипта.
2. Нам нужно иметь возможность прерывать выполнение ветки кода в любом месте, с (или без) последующего перезапуска этого кода.
Чаще, но не всегда, эти причины ходят вместе.

Под "1" подходит пример с клавишами - из статьи. Где нужно нажимать кнопки клавиатуры каждую со своей периодичностью, а ля применение бафов/ударов со временем отката.
Можно сделать на паузах если они маленькие и не критично не точное выполнение периодов, ну будет чуть дольше, чем нужно. Если паузы большие, они будут мешать друг другу сильнее и может стать неприемлим такой подход. Здесь два варианта решения: на таймерах или на потоках. На потоках понятно как это будет выглядеть, плюс код будет меньше и менее сложный. На таймерах, каждому нажатию зададим свой таймер и все эти действия проверяем последовательно в цикле. Чей таймер вышел - то действие и выполняется. Точность меньше, чем на потоках из-за времени проверок и времени срабатываний вышедших таймеров.
Всё хорошо, если у нас действия простые, типа этих нажатий кнопок, а если более продолжительные? Допустим мы в цикле программы ожидаем какие-то признаки и в зависимости от признака выполняем довольно большой кусок кода. Но даже если один из признаков сработал и мы начали выполнять, нам требуется продолжать следить за другими признаками.
Пример -  рыбалка на 2+ снасти. Нужно следить за разными поплавками - это можно делать и последовательно, даже именно лучше последовательно, но при клёве нужно выполнят действия по вылову. Вот действия лучше запускать в отдельном потоке. При этом может начаться клёв на другую снасть и нужно одновременно вылавливать и другой.
Здесь у нас к первой причине присоединяется и вторая.

Всё это сопровождается возможностью включать/отключать отдельные слежения (ветки кода) не городя кучу условий.

Другой пример: в давние времена, когда деревья были большими, а версия кликера маленькой, писал я скрипт на зомби ферму. Скрипт выполнял по кругу очень продолжительные и сложные действия. В основном всё работало нормально в пределах нескольких часов. Но если дольше, флеш сильно сжирал память уставал и начинал падать. Если сбои по причине интернета или браузера были очень редкими и на них писать код проверки было мало смысла, то с этим сбоем надо было решать. Решаем стандартно, следим за каким нибудь постоянным элементом игры который при падении пропадает или проверяем не появилось ли сообщение о падении (сбоев было несколько и каждый нужно ловить по своему). Написал подпрограмму проверки на сбой и при сбое действия по устранению и GOTO на старт скрипта с начала. Теперь вопрос когда и где вызывать эту подпрограмму проверки. Начал раскидывать её максимально по скрипту, внутри больших и средних по продолжительности циклов с действиями, после основных блоков. Мало. Внутри часто использующихся блоков... Стало легче, но полностью вопрос не решило.
Потому, что в скрипте было много циклов ожидания изменений на экране и с необязательным появлением картинки и с обязательным. С необязательным не так критично, а вот с обязательным нужно было добавлять вызов проверки ещё и внутрь всех этих циклов ожидания. Стало всё не очень хорошо и уж совсем не красиво и неудобно. Я до сих пор не уверен не пропустил ли я потенциальные места для проверки.
К тому же простой перезапуск всего скрипта с самого начала не подходил, он был не с самого начала, а после некоторой части инициализаций. К тому же пришлось перешерстить все переменные и задать им начальные значения не полагаясь на значения по умолчанию, ведь после перехода в начало переменные уже были использованы и там хранилось много разных значений которые нужно было сбросить.
Вот когда в кликере появились потоки эту задачу стало гораздо проще реализовать. И работала она намного надёжнее и перезапускала правильней без выпрыгивания по GOTO из десятка подпрограмм и нескольких вложенных циклов.
Вот такие дела.

Ещё пример на 2 причину: управление кнопками типа горячих клавиш. Разные кнопки запускают/останавливают разные части кода. Даже если не нужно их одновременное выполнение, особенно если не нужно!
И если реализовывать без потоков, просто по условиям запуск можно, то с остановкой проблема. Мы даже если вовремя поймаем нажатие кнопки управления (тоже вопрос как это сделать не раскидывая по скрипту капсулы из условий меняющих флаг или выпригивающих по GOTO), то если менять флаг нам всё равно нужно дождаться окончания действия или подпрыгнуть ближе к этому окончанию. С потоками же мы просто останавливаем или приостанавливаем нужный поток и всё.

Спасибо за очень доходчивый комментарий!

Из всего этого мне реально интересно несколько скриптов в одном, чтобы запускать каждый отдельной комбинацией клавиш.
Сейчас каждый день открываю 3 разных кликера, но в случае СТОП происходят проблемы. Было бы круто, чтобы одна комбинация клавиш гарантированно остановила скрипт. Тем более давно была идея создать больше команд для более мелких задач, но открывать каждый день по 5-8 кликеров из разных папок геморно.

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

Как это реализовать?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Где реально применяются потоки?
« Reply #6 on: July 04, 2022, 09:15:28 AM »
Когда несколько кликеров, они молчат. В случае нажатия комбинации клавиш в активное состояние входит один. Но когда будет один с потоками, то я так понимаю, он всегда будет в активном состоянии, что может отразиться на быстродействии ПК. Верно?
Кликер в принципе никогда не молчит если запущен. Скрипт всё равно выполняется в каком-то цикле. Цикл в котором будут проверяться только нажатие клавиш ни на что не повлияет. Главное только не допускать пустых циклов в которых нет хотя бы минимальной задержки.


Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: Где реально применяются потоки?
« Reply #7 on: July 04, 2022, 09:48:40 AM »
но открывать каждый день по 5-8 кликеров из разных папок геморно.
Как это реализовать?
Перефразируя классика; " Гемор не в клозетах - гемор, в другом месте."
Что мешает запускать-закрывать, всё нужное одним запускающим-закрывающим скриптом и останавливать одним Сочетанием горячих клавиш?

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Re: Где реально применяются потоки?
« Reply #8 on: July 04, 2022, 10:15:43 AM »
Когда несколько кликеров, они молчат. В случае нажатия комбинации клавиш в активное состояние входит один. Но когда будет один с потоками, то я так понимаю, он всегда будет в активном состоянии, что может отразиться на быстродействии ПК. Верно?
Кликер в принципе никогда не молчит если запущен. Скрипт всё равно выполняется в каком-то цикле. Цикл в котором будут проверяться только нажатие клавиш ни на что не повлияет. Главное только не допускать пустых циклов в которых нет хотя бы минимальной задержки.

Как это сделать, если есть к примеру 3 скрипта?

Запуск первого:
ALT + Z

Запуск второго:
ALT + A

Запуск третьего:
ALT + 2

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Re: Где реально применяются потоки?
« Reply #9 on: July 04, 2022, 10:16:52 AM »
Когда несколько кликеров, они молчат. В случае нажатия комбинации клавиш в активное состояние входит один. Но когда будет один с потоками, то я так понимаю, он всегда будет в активном состоянии, что может отразиться на быстродействии ПК. Верно?
Кликер в принципе никогда не молчит если запущен. Скрипт всё равно выполняется в каком-то цикле. Цикл в котором будут проверяться только нажатие клавиш ни на что не повлияет. Главное только не допускать пустых циклов в которых нет хотя бы минимальной задержки.
То есть если кликер будет гореть зеленым, это не повлияет на работу ПК. Верно?

Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: Где реально применяются потоки?
« Reply #10 on: July 04, 2022, 12:50:59 PM »
Верно?
Не верно, любая запущенная программа в какой-то степени влияет на работу ПК.
 Как вообще кликер может гореть, на ещё зелёным?

SimplY

  • Активный участник
  • ***
  • Posts: 125
    • View Profile
Re: Где реально применяются потоки?
« Reply #11 on: July 04, 2022, 01:02:50 PM »
Верно?
Не верно, любая запущенная программа в какой-то степени влияет на работу ПК.
 Как вообще кликер может гореть, на ещё зелёным?
Так

resident

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Где реально применяются потоки?
« Reply #12 on: July 04, 2022, 01:48:14 PM »
Когда несколько кликеров, они молчат. В случае нажатия комбинации клавиш в активное состояние входит один. Но когда будет один с потоками, то я так понимаю, он всегда будет в активном состоянии, что может отразиться на быстродействии ПК. Верно?
Кликер в принципе никогда не молчит если запущен. Скрипт всё равно выполняется в каком-то цикле. Цикл в котором будут проверяться только нажатие клавиш ни на что не повлияет. Главное только не допускать пустых циклов в которых нет хотя бы минимальной задержки.


Как это сделать, если есть к примеру 3 скрипта?

Запуск первого:
ALT + Z

Запуск второго:
ALT + A

Запуск третьего:
ALT + 2

Сделать поток для управления, который проверяет нажатые клавиши

if(iskeydown(#1)=1)
  if($status1=0)
    print("start 1")
  else
    print("stop 1")
  end_if
  $status1=$status1^1
  wait(5) // задержка чтоб отпустить кнопку до следующего переключения
end_if

if(iskeydown(#2)=1)
  if($status2=0)
    print("start 2")
  else
    print("stop 2")
  end_if
  $status2=$status2^1
  wait(5) // задержка чтоб отпустить кнопку до следующего переключения
end_if

selen

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Где реально применяются потоки?
« Reply #13 on: July 04, 2022, 06:13:34 PM »
А как насчет того что потоки нельзя перезапустить?То есть как я понимаю  вариант годится только для скриптов в десяток строк.

resident

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Re: Где реально применяются потоки?
« Reply #14 on: July 05, 2022, 12:24:52 AM »
А как насчет того что потоки нельзя перезапустить?То есть как я понимаю  вариант годится только для скриптов в десяток строк.
В смысле нельзя перезапустить?
У меня вот так работает, останавливается и запускается

Code: [Select]
thread(scan_hp,0)
  ...
  setthread(scan_hp,2)
end_thread

WHILE(1)
  GETSCREEN
  setthread(scan_hp,1)
  setthread(scan_amo,1)
  setthread(scan_enemy,1)
  waitms(50)
END_CYC