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

Основной раздел => Общие вопросы => Учебные статьи => Topic started by: Johnny on October 25, 2014, 09:32:54 AM

Title: Потоки
Post by: Johnny on October 25, 2014, 09:32:54 AM
Актуально для версии 4.11+

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

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

Данный поток с именем thr_name начнет крутиться сразу после старта скрипта. Если вы хотите что бы поток запустился позже, то необходимо в шапке после имени добавить 0. То есть
Code: (clickermann) [Select]
Thread(thr_name, 0)
// тело потока
End_thread

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

Каждый поток обладает собственным адресным пространством, поэтому задержка wait() в одном ни коим образом не влияет на остальные потоки. При этом, потоки имеют доступ к общим переменным и графическому буферу. Стоит отметить, что из-за особенностей архитектуры кликера, подпрограммы Sub() не могут разделяться потоками, поэтому для каждого они индивидуальны и должны быть объявлены внутри потока. Другими словами, подпрограммы описанные внутри одного потока не могут быть вызваны другим потоком.
Основное (абстрактно) тело скрипта, даже если оно описано без thread() .. end_thread так же является отдельным потоком, поэтому для него справедливо все вышесказанное. Поэтому фактически, сценарии вида
Code: (clickermann) [Select]
Thread(thr1)
   Wait(1)
End_thread

Print("Hello")
Wait(3)
И
Code: (clickermann) [Select]
Thread(thr1)
   Wait(1)
End_thread

Thread(thr2)
   Print("Hello")
Wait(3)
End_thread
Абсолютно одинаковы.
Последнее что вам необходимо знать, это то, что как и основной скрипт, потоки должны «давать передохнуть» процессору, поэтому потрудитесь разместить внутри них wait’ы, на которые он обязательно наткнется, иначе ваш сценарий будет серьезно нагружать процессор в ряде случаев.

Несколько показательных примеров
Первый случай, о котором иногда спрашивают – это нажатие клавиш (да и вообще действия) по интервалу. Например, каждые 3 секунды жмем A, каждые 5 секунд – B. В обычном случае нам бы потребовался единичный интервал (секунда) и два счетчика, которые наращиваются. Затем в двух условиях проверяются их значения и если счетчик достиг 3 (или 5) то выполняются действия и счетчик обнуляется. Два счетчика нужны, потому что действия независимы друг от друга. Сам скрипт выглядит так (для удобства сами нажатия заменены на вывод в лог)
Code: (clickermann) [Select]
wait(1)
$cnt1 = $cnt1 + 1
$cnt2 = $cnt2 + 1

if($cnt1 = 3)
   print("A")
   $cnt1 = 0
end_if

if($cnt2 = 5)
   print("B")
   $cnt2 = 0
end_if

При этом, если внутри условия будет ряд других затратных инструкций или упаси Боже задержка – в классическом решении реализовать такое было бы весьма затратно (приходилось бы вычислять временные затраты на каждое действие, вводить поправки на разницу и т.д.)
Реализуем тот же самый скрипт на потоках
Code: (clickermann) [Select]
thread(th1)
   print("A")
   wait(3)
end_thread

thread(th2)
   print("B")
   wait(5)
end_thread

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

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

Code: (clickermann) [Select]
if (iskeydown(#A)=1)
   print("A")
   wait(3)
end_if

if (iskeydown(#B)=1)
   print("B")
   wait(3)
end_if

waitms(10)

Безусловно, можно попробовать добавить третье условие двойной проверки обоих нажатий iskeydown() & iskeydown(), но тогда будут срабатывать и одиночные условия, ведь клавиша то зажата. Неразрешимая для неискушенного программиста задача элементарно решается введением потоков под каждый хоткей.
Code: (clickermann) [Select]
thread(th1)
   if (iskeydown(#A)=1)
      print("A")
      wait(3)
   end_if
   waitms(10)
end_thread


thread(th2)
   if (iskeydown(#B)=1)
      print("B")
      wait(3)
   end_if
   waitms(10)
end_thread

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

Code: (clickermann) [Select]
thread(th1)

  sub(inside)
    // ...
  end_sub

  // call
  inside()

end_thread

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

Code: (clickermann) [Select]
sub(outside)
  // ...
end_sub


thread(th1)
  // call
  outside()

end_thread

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

Code: (clickermann) [Select]
Thread(thr_name)
   // Фармим мобов
End_thread

GETSCREEN
IF_PICTURE_IN (0,0, $_xmax,$_ymax, "file.bmp", -1, 100)
   setThread(thr_name, 0)
   WAITMS(50)
ELSE
   setThread(thr_name, 1)
   WAITMS(50)
END_IF

Возможно ли НЕ выключать поток, А ставить его на паузу и снимать с паузы?
Title: Re: Потоки
Post by: Oraven on October 29, 2014, 01:03:10 PM
Возможно ли НЕ выключать поток, А ставить его на паузу и снимать с паузы?

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

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

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

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

INT

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

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

Пример 

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

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

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

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

Code: (clickermann) [Select]
IF($time1 < $_time_t)
   // условие сработает снова через 60 сек

   $time1 = $_time_t + 60
END_IF

IF($time2 < $_time_t)
   // условие сработает снова через 2 минуты

   $time2 = $_time_t + 120
END_IF

WAIT(1)
Title: Re: Потоки
Post by: Alekzandr on November 03, 2014, 04:24:58 PM
Да, спасибо, мне так и нужно.
Title: Re: Потоки
Post by: Alex59 on November 16, 2014, 10:40:10 AM
Доброго времени. Что-то не работает поток в моем случае, я открываю 1 окно (делаю на передний план) - копирую из него текст, затем открываю 2 окно и вставляю текст туда. Но как только в поток эти действия включаю - перестает работать:

Code: [Select]
#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
Title: Re: Потоки
Post by: Hito on November 16, 2014, 02:18:31 PM
Доброго времени. Что-то не работает поток в моем случае, я открываю 1 окно (делаю на передний план) - копирую из него текст, затем открываю 2 окно и вставляю текст туда. Но как только в поток эти действия включаю - перестает работать:

Code: [Select]
#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

А я че-то и не вижу у тебя тут созданного потока...
Title: Re: Потоки
Post by: Hito on November 16, 2014, 02:51:32 PM
Вот твой скрипт с потоком:

Code: (clickermann) [Select]
THREAD(name)  // Начало потока

   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
   
END_THREAD  // Конец потока

BEEP(800,200)  // Команда работает параллельно с потоком
WAIT(1)
Title: Re: Потоки
Post by: Alex59 on November 16, 2014, 03:47:20 PM
Спасибо, этот теперь работает. Но только если делать окно активным, а если вместо WNDBUMP поставить HSET - то снова не работает. Мне из 2х и более окон одновременно нужно скопировать информацию в 1 окно.
Title: Re: Потоки
Post by: Hito on November 16, 2014, 03:52:07 PM
Спасибо, этот теперь работает. Но только если делать окно активным, а если вместо WNDBUMP поставить HSET - то снова не работает. Мне из 2х и более окон одновременно нужно скопировать информацию в 1 окно.

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

Ну, если привязка и отвязка будет последовательной (то есть - сначала привязался кликер к одному окну, потом к другому и так далее), то это возможно. Но привязываясь к окну "2", кликер отвяжется от окна "1".
Title: Re: Потоки
Post by: Alex59 on November 16, 2014, 04:24:18 PM
Тут цифры окон только поменял (перезапустил браузер и блокнот) но алгоритм тот-же, Ctrl+C и Ctrl+V не срабатывают:
Code: [Select]
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)
Title: Re: Потоки
Post by: Hito on November 16, 2014, 04:37:21 PM
Ты на ноуте, или на компе макрос запускаешь?
Title: Re: Потоки
Post by: Alex59 on November 16, 2014, 04:41:23 PM
на ноуте, поставил win 10 тестовую, и на ноуте есть еще vmware win XP пробую и там и там
Title: Re: Потоки
Post by: Hito on November 16, 2014, 04:51:11 PM
На - пробуй:

Code: (clickermann) [Select]
#ps2_keyboard
#ps2_mouse
THREAD(name)
   //WNDBUMP(197198)
   HSET(197198,1)
   
   WAIT(1)
   
   DBLCLICK(526,704)
   
   WAIT(1)
   KEYDOWN (#CTRL)
   WAITMS (100)
   KEYPRESS(#C)
   WAITMS (50)
   KEYUP (#CTRL)
   
   HSET(197198,0)  // Этот параметр не обязателен. При выполнении команды из 23-ей строки, кликер автоматом отвяжется от окна "197198" и привяжется к "328256".
   
   WAIT(1)
   
   //WNDBUMP(328256)
   HSET(328256,1)
   
   WAIT(1)
   
   WAITMS(300)
   KEYDOWN (#CTRL)
   WAITMS (100)
   KEYPRESS(#V)
   WAITMS (50)
   KEYUP (#CTRL)
   waitms(200)
   
   KEYPRESS(#ENTER)
   
   HSET(328256,0)
   
   HALT
   
END_THREAD  //

BEEP(800,200)  // Тут никаких HSET, так как у тебя работают последовательные привязки в потоке.
WAIT(1)
Title: Re: Потоки
Post by: Alex59 on November 16, 2014, 06:58:59 PM
Спасибо большое за оперативную помощь! Но увы, этот вариант тоже не работает. Завтра на работе буду кумекать что к чему :o
Title: Re: Потоки
Post by: Vint on November 16, 2014, 08:54:13 PM
Да что же блин такое...
   KEYDOWN ()
   KEYUP ()
Не работают в режиме привязки, 100500 раз упоминалось, в половине тем на форуме и каждые 20 постов в группе.
Title: Re: Потоки
Post by: Hito on November 16, 2014, 08:57:08 PM
Да что же блин такое...
   KEYDOWN ()
   KEYUP ()
Не работают в режиме привязки, 100500 раз упоминалось, в половине тем на форуме и каждые 20 постов в группе.

Через раз... У меня бывало, что и работало... Потому и предложил попробовать режиме PS/2
Title: Re: Потоки
Post by: i0 on November 20, 2014, 01:27:21 AM
Потоки могут невозбранно контролировать друг друга
Quote from: Clickermann Help
SetThread (thread_name, state) - меняет состояние дочернего потока

так всё таки только дочернего или любого?
Title: Re: Потоки
Post by: Hito on November 20, 2014, 12:34:37 PM
Потоки могут невозбранно контролировать друг друга
Quote from: Clickermann Help
SetThread (thread_name, state) - меняет состояние дочернего потока

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

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

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

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

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

Code: (clickermann) [Select]

HSET(WNDFIND("Персонаж"),1) // находим окно
WNDPOS(WNDFIND("Персонаж"),85,0) // двигаем на место
WNDSIZE(WNDFIND("Персонаж"),1200,1000) // ставим размер

#include "func.cms"

THREAD(boting, 0) // основной бот
#include "func.cms"
   bot()
END_THREAD

THREAD(rest, 1) // ежечасный перезапуск файрфокса для устранения утечки памяти
#include "func.cms"   
   WHILE(1 = 1)
      $time = $_time_t + 3600
      IF($time < $_time_t)
            PRINT("рестарт")
            SetThread (boting, 0) // остановить бота
            KEYPRESS(#HOME)
            LCLICK(710+$x,310+$y)
            waiting()
            HSET(WNDFIND("Персонаж"),0) // отвязаться от окна
            LCLICK(1256,11) // закрыть браузер
            WAIT(5)
            EXECUTE("C:\Program Files (x86)\Mozilla Firefox\firefox.exe")
            WAIT(10)
            HSET(WNDFIND("Персонаж"),1)
            WNDPOS(WNDFIND("Персонаж"),85,0)
            WNDSIZE(WNDFIND("Персонаж"),1200,1000)
            SetThread (boting, 1) // запустить бота
            $time = $_time_t + 3600
      END_IF
   END_CYC
END_THREAD

//=============================================
nachalo() // поиск нулевой точки, привязка, рассчет смещения координат кнопок ...
SetThread (boting, 1)
PRINT("начал ботинг")
$times1 = 0
WHILE($times1 = 0)
   IF(($_time_h = 1) & ($_time_m = 55)) // ботим до 1:55
      SetThread (boting, 0) //в 1:55 остановка потока
      PRINT("остановил ботинг")
      $times1 = 1
   END_IF
END_CYC
IF(($_time_h = 1) & ($_time_m > 55)) // если время больше 1:59 ищем попап
   gift()
END_IF
SetThread (boting, 1) // запуск потока
PRINT("начал ботинг")
WHILE($_time_h < 5) // ботим до 5 утра
   WAITMS(500)
ELSE
   SetThread (boting, 0) // после 5 остановка потока
   PRINT("остановил ботинг")
END_CYC
bay()
HSET(WNDFIND("Персонаж"),0)
EXECUTE("sleep.bat")
halt

Пока писал этот пост, перечитывал и подписывал комментарии, допетрил в чем проблема ))
Code: (clickermann) [Select]
THREAD(rest, 1) // ежечасный перезапуск файрфокса для устранения утечки памяти
#include "func.cms"   
   WHILE(1 = 1)
      $time = $_time_t + 3600
      IF($time < $_time_t)
            restart()
            $time = $_time_t + 3600
      END_IF
      WAIT(10) // !!!добавил эту паузу и все стало нормально!!!
   END_CYC
END_THREAD
Title: Re: Потоки
Post by: Oraven on November 23, 2014, 10:23:43 PM
Условие
Code: (clickermann) [Select]
$time = $_time_t + 3600
IF($time < $_time_t)
не может быть выполнено! Ты все время прибавляешь $time и в результате $time никогда не будет меньше $_time_t

Правильно так
Code: (clickermann) [Select]
DEFINE($time, $_time_t + 3600)
IF($time < $_time_t)

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

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

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

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

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

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

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

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

Code: (clickermann) [Select]
Theard(Name1) {

/*some code here*/

SetTheard(Name1, 0);

}
Title: Re: Потоки
Post by: Oraven on November 25, 2014, 03:21:40 PM
А вот основную программу можно прерывать?
Нет.

Поток можно прервать в самом себе, например:
Конечно можно
Code: (clickermann) [Select]
THREAD(Name1, 1)
   // код
   
   SETTHREAD (Name1, 0)
END_THREAD
Title: Re: Потоки
Post by: Vint on November 25, 2014, 03:48:31 PM
Потоки, классно.
А вот основную программу можно прерывать?
А основную тоже можно засунуть в поток явно.
Title: Re: Потоки
Post by: MIG29 on November 28, 2014, 03:25:03 AM
Потоки, классно.
А вот основную программу можно прерывать?
А основную тоже можно засунуть в поток явно.

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

Аннет,  я передумал, скорее будет просто этим управлять =)
Title: Re: Потоки
Post by: MIG29 on December 10, 2014, 11:02:30 PM
Перенесите, пожалуйста, если не в ту тему пишу.

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

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

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

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

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

1500 строк + внешние файлы. Какая строка зависла не видно. Print можно вставить в каждую строку как макрос , но нужно чтобы в лог выводилось номер строки.
Раньше была такая возможность (номер строки)?!
Title: Re: Потоки
Post by: Vint on December 11, 2014, 10:17:38 AM
Была... но не работала  :) ещё на 4.5 - 4.6
Title: Re: Потоки
Post by: Vint on December 23, 2014, 04:59:03 PM
Развлечения. Скрипт называется Дежа вю (Deja Vu)
Практического применения пока не нашёл.
Code: (clickermann) [Select]
LOGSHOW (1)
WNDSIZE(WNDFIND("Лог"),250,110)

THREAD(log_glue, 1)
   LOGSHOW (1, $_xmouse+10,$_ymouse+18)
   WAITMS(10)
END_THREAD

THREAD(SCREEN, 1)
   GETSCREEN
   LOGCLEAR
   LOGWRITE ("X,Y: ", $_xmouse, ",", $_ymouse)
   LOGWRITE ("Цвет: ",PXL($_xmouse,$_ymouse))
   LOGWRITE ("hWND: ", HGET($_xmouse,$_ymouse))
   WAITMS(200)
END_THREAD

WHILE(1)
   WAIT(3600)
END_CYC

Вот ещё такой вариант, можно использовать при закрытом редакторе или для вывода значения переменных в реальном времени.
Code: (clickermann) [Select]
LOGSHOW (1, $_xmax-250, $_ymax-70-110)
WNDSIZE(WNDFIND("Лог"),250,110)
$pos = 0

THREAD(log_glue, 1)
   IF(($pos = 0) & ($_xmouse > $_xmax-250) & ($_ymouse > $_ymax-180) & ($_ymouse < $_ymax-70))
      LOGSHOW (1, 0, $_ymax-70-110)
      $pos = $pos^1
   END_IF
   IF(($pos = 1) & ($_xmouse < 250) & ($_ymouse > $_ymax-180) & ($_ymouse < $_ymax-70))
      LOGSHOW (1, $_xmax-250, $_ymax-180)
      $pos = $pos^1
   END_IF
   WAITMS(30)
END_THREAD

THREAD(SCREEN, 1)
   GETSCREEN
   LOGCLEAR
   LOGWRITE ("X,Y: ", $_xmouse, ",", $_ymouse)
   LOGWRITE ("Цвет: ",PXL($_xmouse,$_ymouse))
   LOGWRITE ("hWND: ", HGET($_xmouse,$_ymouse))
   WAITMS(200)
END_THREAD

WHILE(1)
   WAIT(3600)
END_CYC
Title: Re: Потоки
Post by: АНТИКЛАН on February 12, 2015, 03:18:12 AM
Могут ли потоки повесить целевую программу?
Если в потоке уже есть задержки обязательно ли ставить задержку перед END_THREAD?

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

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

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

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

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

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

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

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

Пока не было потоков, у меня был отлично работающий скрипт на 7 окон:
Code: [Select]
$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:
Code: [Select]
$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

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

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

Будем ждать дальнейших улучшений потоков.
Title: Re: Потоки
Post by: Hito on March 04, 2015, 02:32:15 PM
Потоки пока еще очень сырые.
GETSCREEN не изолирован.
Переменные не изолированы.
Привязка одна на весе потоки.
Поток возможно поставить на паузу, но нельзя перезапустить.

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

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

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

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

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

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

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

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

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

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

(http://f6.s.qip.ru/SNS8HTNU.png)
Title: Re: Потоки
Post by: АНТИКЛАН on November 15, 2015, 02:22:39 PM
дело в том, что в большенстве случаев этого ненужно, гораздо проще когда поток должен быть включён посылать команду на его включение независимо от состояния потока и выключать соответствующим образом, даже если он уже на паузе. Но, как известно "Охота , пуще неволи!"
Code: (clickermann) [Select]
THREAD(thr_name2) 

   IF(iskeydown(#F2)=1)
      BEEP(800,200)
      WHILE(iskeydown(#F2)=1)
         WAITMS(100)
      END_CYC
      IF($_stop = 0)
         IF($hint = 6)
            HINTPOPUP(" ","пауза")
         END_IF
         SETTHREAD (thr_name1,0)
         SETTHREAD (thr_name,0)
         INC($_stop,1)
      ELSE
         IF($hint = 6)
            HINTPOPUP(" ","продолжить")
         END_IF
         logwrite("продолжить")
         SETTHREAD (thr_name1, 1)
         SETTHREAD (thr_name, 1)
         INC($_stop,-1)
         $time593 = 0
      END_IF
   END_IF
   IF(($_stop = 1)&($time593 < $_time_t))
      IF($hint = 6)
         HINTPOPUP(" ","включена пауза")
         $time593 = $_time_t + 45
      END_IF
   END_IF
   
END_THREAD
в потоке проверяется нажатие клавиши F2 первое нажатие ставит два других потока на паузу, второе продолжить работу. если пауза включена и сообщения в трей разрешены в настройках то выводится сообщение HINTPOPUP(" ","включена пауза") если состояние потоков нужно узнать програмно, то всегда можно обратиться к значению переменной $_stop

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

Code: (clickermann) [Select]
START:

SETTHREAD (THREAD_NAME, 1)
WAITMS(5)

GOTO(START)
Code: (clickermann) [Select]
START:

SETTHREAD (THREAD_NAME, 0)
WAITMS(5)

GOTO(START)
Title: Re: Потоки
Post by: АНТИКЛАН on November 15, 2015, 05:25:59 PM
$_stop  - обычная переменная, название может быть любым. проверять и изменять можно в любом потоке, ограничений нет.

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

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

НИЧЕГО.
Code: (clickermann) [Select]
THREAD(thr_name1)
   LOGWRITE ("1поток включен")
   // тело потока   
   waitms(3000)
END_THREAD

THREAD(thr_name2)
   LOGWRITE ("2поток включен")
   // тело потока   
   waitms(3000)
END_THREAD

LOGWRITE ("команда включить 1 поток")
SETTHREAD (thr_name1, 1)
WAIT(2)

LOGWRITE ("команда вЫключить 2 поток")
SETTHREAD (thr_name2, 0)
WAIT(2)

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

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

Конкретно меня интересует, если поток уже запущен и приходит команда на его запуск что делает кликер? Тупо перезапускает его или проверяет и оставляет в покое ничего не делая? Как сильно могут сказаться постоянные перезапуски потоков на производительности? Я просто ввожу в свои скрипты возможности автоматического включения/отключения функций при разных условиях и мне необходимо знать такие нюансы которые я описал.
Title: Re: Потоки
Post by: Hito on November 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)
Title: Re: Потоки
Post by: Vint on November 16, 2015, 10:31:08 AM
Конкретно меня интересует, если поток уже запущен и приходит команда на его запуск что делает кликер? Тупо перезапускает его или проверяет и оставляет в покое ничего не делая? Как сильно могут сказаться постоянные перезапуски потоков на производительности? Я просто ввожу в свои скрипты возможности автоматического включения/отключения функций при разных условиях и мне необходимо знать такие нюансы которые я описал.
Перезапуска нет. Команда просто игнорируется.
Title: Re: Потоки
Post by: Oraven on November 16, 2015, 10:32:03 AM
Это не команда на запуск а скорее переключатель 0 - не работает, 1 - работает.
К сожалению пока потоки нельзя перезапускать а только ставить на паузу.
Title: Re: Потоки
Post by: АНТИКЛАН on November 16, 2015, 08:12:21 PM
Перезапуска нет. Команда просто игнорируется.

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

Действительно, очевидно лечится не использованием паузы. Как то надо выкручиваться...
Title: Re: Потоки
Post by: Victor on February 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) Скрипт зациклен. Выполняется сутками.
Title: Re: Потоки
Post by: Oraven on February 01, 2016, 12:48:02 PM
Куда подробнее все и так просто. $_time_t возвращает текущее время Unix в секундах. Вот на этом и создается таймер, а потом в условии сравнивается значение переменной с текущем временем.
Code: (clickermann) [Select]
IF($time1 < $_time_t)
   // условие сработает снова через 60 сек
   
   $time1 = $_time_t + 60
END_IF

IF($time2 < $_time_t)
   // условие сработает снова через 2 минуты
   
   $time2 = $_time_t + 120
END_IF

IF($time3 < $_time_t)
   // условие сработает снова через 10 минут
   
   $time3 = $_time_t + 600
END_IF

WAITMS(50)
Title: Re: Потоки
Post by: Victor on February 01, 2016, 01:25:29 PM
Спасибо буду пробовать :)
Title: Re: Потоки
Post by: Victor on February 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




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

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

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

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

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

Что внутри этих условий? Может проблема "не работы" там?
Title: Re: Потоки
Post by: Victor on February 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) Задачи должны выполняться последовательно.

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


Title: Re: Потоки
Post by: Oraven on February 01, 2016, 04:14:04 PM
Не понимаю в чем твоя проблема?

Code: (clickermann) [Select]
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)
Title: Re: Потоки
Post by: Vint on February 01, 2016, 04:14:46 PM
Делать то же что ты и делаешь руками.
Вот что делаешь, если выполняешь процесс 2 длительностью 9 мин, а в это время наступило время делать 3?

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

Повторение — мать учения! :D
Title: Re: Потоки
Post by: i0 on February 08, 2016, 09:53:14 AM
заметка из личного опыта

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

+не на 100% уверен, что два события не могут совпасть.
Title: Re: Потоки
Post by: Victor on April 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.
и не пойму как сделать чтобы каждый новый раз он новый файл грузил.
Подскажите пожалуйста.
Title: Re: Потоки
Post by: Oraven on April 17, 2016, 10:55:52 AM
За место #include "1.cms" будет вставлено то что находится в файле 1.cms
Code: (clickermann) [Select]
IF($time1 < $_time_t)
   INC($n,1)
   SWITCH($n)
   CASE(1)
      #include "1.cms"
   CASE(2)
      #include "2.cms"
   CASE(3)
      #include "3.cms"
   CASE(4)
      #include "4.cms"
   CASE(5)
      #include "5.cms"
   CASE(6)
      #include "6.cms"
   CASE(7)
      #include "7.cms"
   CASE(8)
      #include "8.cms"
   CASE(9)
      #include "9.cms"
   CASE(10)
      #include "10.cms"
   DEFAULT
   END_SWITCH
   IF($n = 10)
      $n = 0
   END_IF
   $time1 = $_time_t + 10820
END_IF
Title: Re: Потоки
Post by: Victor on April 17, 2016, 10:17:34 PM
 ::)Спасибо.
Title: Re: Потоки
Post by: Vint on April 18, 2016, 10:02:39 AM
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
Title: Re: Потоки
Post by: dramster on April 18, 2016, 09:37:04 PM
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\
Title: Re: Потоки
Post by: Oraven on April 18, 2016, 09:45:37 PM
Только так лучше не привыкай.
 Если в подключаемом модуле будет подпрограмма или поток, так делать нельзя.
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\

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

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

Title: Re: Потоки
Post by: Vint on April 19, 2016, 08:58:42 AM
насчет потоков ладно, но что с подпрограммами в #include не так? пользуюсь сабами в инклудах, вроде проблем небыло  :-\
Конечно работают, для этого они и предназначены.
Но вот здесь уже работать не будут
Code: (clickermann) [Select]
SUB(name1)
   #include "mylib.cms"
END_SUB
Если в mylib.cms есть подпрограммы или потоки. Потому что include закопан в тело другой подпрограммы, что делать нельзя. Правильно делать так
Code: (clickermann) [Select]
#include "mylib.cms"
SUB(name1)
   name2() // вызов ПП из mylib.cms
END_SUB
Все инклюды в корне скрипта.
Title: Re: Потоки
Post by: Victor on August 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
Title: Re: Потоки
Post by: Vint on August 04, 2016, 03:16:48 PM
...END_IF брал время...
END_IF в принципе ничего не берёт, это знак окончания блока IF

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

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

Code: (clickermann) [Select]
$downtime = 120
Все переменные глобальны. Код из всех include вставляется на место, где прописано подключение.
Примерно так:
Code: (clickermann) [Select]
// код в 1.cms
SUB(подпр_1)
    // ...
    $downtime = 120 // время простоя выставляем 120
END_SUB

// код в 2.cms
SUB(подпр_2)
    // ...
    $downtime = 30 // время простоя выставляем 30
END_SUB


// основной скрипт
#include "1.cms"
#include "2.cms"
IF($time2 < $_time_t)
    // ...
    IF($n = 3)
        подпр_1()
    ELSE
        подпр_2()
    END_IF
    // ...
    $time2 = $_time_t + $downtime
END_IF

Title: Re: Потоки
Post by: Victor on August 04, 2016, 03:57:21 PM
Спасибо сегодня вечером попробую :)
Title: Re: Потоки
Post by: Victor on August 04, 2016, 04:52:28 PM
Я так понимаю, если это

Code: (clickermann) [Select]
IF($time1 < $_time_t)
   INC($n,1)
   SWITCH($n)
   CASE(1)
      #include "1.cms"
   CASE(2)
      #include "2.cms"
   CASE(3)
      #include "3.cms"
   CASE(4)
      #include "4.cms"
   CASE(5)
      #include "5.cms"
   CASE(6)
      #include "6.cms"
   CASE(7)
      #include "7.cms"
   CASE(8)
      #include "8.cms"
   CASE(9)
      #include "9.cms"
   CASE(10)
      #include "10.cms"
   DEFAULT
   END_SWITCH
   IF($n = 10)
      $n = 0
   END_IF
   $time1 = $_time_t + $downtime
END_IF


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

Code: (clickermann) [Select]
IF($time1 < $_time_t)
   // условие сработает снова через 60 сек
 
   $time1 = $_time_t + 60
END_IF
 
IF($time2 < $_time_t)
   // условие сработает снова через 2 минуты
 
   $time2 = $_time_t + 120
END_IF
 
IF($time3 < $_time_t)
   // условие сработает снова через 10 минут
 
   $time3 = $_time_t + 600
END_IF
 
WAITMS(50)




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

Code: (clickermann) [Select]

IF($time1 < $_time_t)
   // условие сработает снова через $downtime (описан в поключаемом модуле)
    INC($n,1)
   SWITCH($n)
   CASE(1)
      #include "1.cms"
   CASE(2)
      #include "2.cms"
   CASE(3)
      #include "3.cms"
   CASE(4)
      #include "4.cms"
   CASE(5)
      #include "5.cms"
   CASE(6)
      #include "6.cms"
   CASE(7)
      #include "7.cms"
   CASE(8)
      #include "8.cms"
   CASE(9)
      #include "9.cms"
   CASE(10)
      #include "10.cms"
   DEFAULT
   END_SWITCH
   IF($n = 10)
      $n = 0
   END_IF
   $time1 = $_time_t + $downtime
END_IF

 
IF($time2 < $_time_t)
   // условие сработает снова через 2 минуты
 
   $time2 = $_time_t + 120
END_IF
 
IF($time3 < $_time_t)
   // условие сработает снова через 10 минут
 
   $time3 = $_time_t + 600
END_IF
 
WAITMS(50)



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

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

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

Вопрос по #include .

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

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

Обрати внимание на задержки в скрипте!
Code: (clickermann) [Select]
THREAD(t1, 1)
   LOGWRITE ("Поток 1")
   WAITMS(50)
END_THREAD

THREAD(t2, 1)
   LOGWRITE ("Поток 2")
   WAITMS(50)
END_THREAD

// основной поток
WAIT(1) // тут тоже лучше прописать задержку
Title: Re: Потоки
Post by: Andrij on June 19, 2017, 09:44:13 PM
Там все сложнее.
Сделано под браузерную игру откривает два окна и скрипт большои местами задержки от 15 секунд и до наскольких минут.
 Процесор на 100% загружен. Двох ядерний 3.1 на ядро +4 гб озу
Сейчас думаю комп под єто купить но не знаю что вибрать
Title: Re: Потоки
Post by: АНТИКЛАН on August 28, 2017, 09:17:20 AM
Там все сложнее.
Сделано под браузерную игру откривает два окна и скрипт большои местами задержки от 15 секунд и до наскольких минут.
 Процесор на 100% загружен. Двох ядерний 3.1 на ядро +4 гб озу
Сейчас думаю комп под єто купить но не знаю что вибрать

Не нужно новый комп. У тебя просто недоработка в скрипте. Где то цикл без задержек шпарит вот и всё.
Title: Re: Потоки
Post by: Alexey+ on September 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