Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Orotund on March 28, 2015, 11:16:18 PM
-
Здрасте, писал я себе код и таки написал, и вышел код совершенно кривой и "медленный" но рабочий. И в один ужасный день, решил я переписать его используя "потки" введя тем самым новые функции в мою програмку. И случилась беда, сейчас в програмке имеется 5 потоков:
один анализирует экран и совершает проверки по кругу, если условие выполнено то запускается нужный поток действия, а поток "анализа" выключается. После того как нужный поток "действия" отработал, он выключает себя и вновь запускает поток анализа.
Беда состоит в том что все потоки работают почему-то одновременно и отказываются выключать друг друга, игнорируя инструкцию SETTHREAD.
Вот эти 5 потоков должны работать по идее поочередно, а следующие потоки будут работать параллельно с этими основными 5тью, но это в будующем.
Подскажите пожалуйста в чем ошибка и если то что я хочу можно реализовать без потоков, то скажите как. Главное не использовать метки skip: , т.к. они работают прескверно и ломают одновременную работу потоков( поправте если это не так).
Вот скидываю часть кода в котором случилась беда, здесь без литра не разобраться:
Thread(thr_analys,1)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("найден варп! Значение Warp:",$warp)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка величены dagger
IF($dagger > $dagger_max )
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка вкл ли long_range
IF ($long_range = 1)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
ELSE
//==========================Окончание проверок
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//=============================================
End_thread
Thread(thr_looting,0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
MOVE($return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
//=============================================
End_thread
Thread(thr_run,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF
GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
ELSE
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF
//=============================================
End_thread
Thread(thr_attack,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_analys, 0)
MOVE($_return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_attack, 0)
//=============================================
End_thread
Thread(thr_teleport,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_attack, 0)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж мертв!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Потеряно соединение с сервером!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж находится в ЧС!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
$dagger = 0
$foot = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
//=============================================
End_thread
-
После каждого объявления потока: Thread
я на всякий случай вписал перечнь потоков которые не должны работать:
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0) //пример
Я сначала посчитал, что поток не может выключить сам себя. :(
-
Пока что увидел только это (103 строка) :
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
ELSE
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF
Если поток остановится перед ELSE, то следующий вызов начнется не с начала, а продолжит за ELSE и понеслась. Я без понятия, как в таком случае интерпретируется тогда ELSE..
-
Подчистил лишние "Else" от которых я избавился в коде. Все потоки по прежнему работают одновременно. Ждем помощи специалистов. :(
Thread(thr_analys,1)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("найден варп! Значение Warp:",$warp)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка величены dagger
IF($dagger > $dagger_max )
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка вкл ли long_range
IF ($long_range = 1)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Окончание проверок
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
//=============================================
End_thread
Thread(thr_looting,0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
MOVE($return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
//=============================================
End_thread
Thread(thr_run,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF
GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
END_IF
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
//=============================================
End_thread
Thread(thr_attack,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_analys, 0)
MOVE($_return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_attack, 0)
//=============================================
End_thread
Thread(thr_teleport,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_attack, 0)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж мертв!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Потеряно соединение с сервером!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж находится в ЧС!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
$dagger = 0
$foot = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
//=============================================
End_thread
-
В твоем случае потоки не нужны, используй подпрограммы.
Чему равняется $ch_x или это не весь скрипт?
SUB(teleport)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж мертв!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Потеряно соединение с сервером!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж находится в ЧС!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF
$dagger = 0
$foot = 0
WAITMS(300)
END_SUB
SUB(looting)
MOVE($return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
END_SUB
SUB(run)
IF($foot > $foot_max)
$foot = 0
$dagger = 0
teleport()
END_IF
GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
ELSE
teleport()
END_IF
END_SUB
SUB(attack)
MOVE($_return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
END_SUB
//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
looting()
END_IF
//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
teleport()
END_IF
//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("найден варп! Значение Warp:",$warp)
teleport()
END_IF
//==========================Проверка величены dagger
IF($dagger > $dagger_max )
run()
END_IF
//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
attack()
END_IF
//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
attack()
END_IF
//==========================Проверка вкл ли long_range
IF ($long_range = 1)
run()
END_IF
//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
attack()
ELSE
//==========================Окончание проверок
run()
END_IF
//=============================================
-
В твоем случае потоки не нужны, используй подпрограммы.
Чему равняется $ch_x или это не весь скрипт?
Ок , попробую заменить потоки подпрограммами. Насчет $ch_x - да, это не весь скрипт, на переменные не обращайте внимания, все работает как часы.
Код все равно работает не так как нужно :(
Я понял в чем дело:
1)Есть ли команда которая прерывает и пропускает выполнение текущей подпрограммы?
2)Можно ли управлять потоком с помощью инструкции SETTHREAD из подпрограммы?
Дело в том что, нужно выполнить несколько условий:
-Если подпрограмма запускает подпрограмму, то текущая подпрограмма должна прекратить работу.
-Если поток "анализа" запустил подпрограмму, то он должен начать свою работу заново, начиная с первой инструкции.
-
Нет функций прерывания, можно написать прыжок ГОТО отправляющий выполнение к метке в конце подпрограммы.
-
Нет функций прерывания, можно написать прыжок ГОТО отправляющий выполнение к метке в конце подпрограммы.
ГОТО нарушит работу потоков?
Мне нужно к основной конструкции программки приделать 2 потока с периодическими действиями с незвисимыми счетчиками... я так понял, что если использовать "прыжки" то будет работать только основная конструкция. :(
Вот так выглядела программка до того как я ее решил переписать, все работает на прыжках и код сам по себе достаточно кривой:
Looting:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
MOVE($return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
GOTO(Looting)
//=====================
else
GOTO(Danger)
END_IF
//=============================================
Danger:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
GOTO(Teleport)
ELSE
GOTO(Danger2)
END_IF
Danger2:
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("íàéäåí âàðï! Çíà÷åíèå Warp:",$warp)
GOTO (Teleport)
//=====================
else
GOTO(Start)
END_IF
//=============================================
Start:
IF($dagger < $dagger_max )
GOTO (Start1)
ELSE
GOTO (Teleport)
END_IF
//=============================================
Start1:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
MOVE($_return1+10, $_return2+25)
ldown($_return1+10, $_return2+25)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Start2)
END_IF
//=============================================
Start2:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
MOVE($_return1+10, $_return2+25)
ldown($_return1+10, $_return2+25)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Start3)
END_IF
//=============================================
Start3:
IF ($long_range = 1)
GOTO(Start4)
ELSE
GOTO(Looting)
END_IF
Start4:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
MOVE($_return1+10, $_return2+20)
ldown($_return1+10, $_return2+20)
WAITMS(100)
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Run)
END_IF
//=============================
Run:
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
GOTO(Teleport)
END_IF
GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
GOTO(Looting)
ELSE
GOTO(Teleport)
END_IF
//=============================================
Teleport:
WAITMS(100)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
Start_analys:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "ñìåðòü.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïåðñîíàæ ìåðòâ!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
ELSE
GOTO(Analys2)
END_IF
Analys2:
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "ñîåäèíåíèå.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïîòåðÿíî ñîåäèíåíèå ñ ñåðâåðîì!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
HALT
ELSE
GOTO(Analys3)
END_IF
Analys3:
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "֖.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïåðñîíàæ íàõîäèòñÿ â ×Ñ!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
HALT
ELSE
GOTO(End_analys)
END_IF
End_analys:
$dagger = 0
$foot = 0
WAITMS(300)
GOTO(Looting)
END_IF
//=====================
-
Мои пять копеек :) Вот упрощенный вариант вашего скрипта
Thread(thr_analys,1)
//wait(1)
waitms(100)
print("Начали")
$rand = RND(1,4)
SWITCH($rand)
case(1)
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)
case(2)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
case(3)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_SWITCH
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
//wait(2)
end_thread
//===================== thr_looting
Thread(thr_looting,0)
waitms(100)
//wait(1)
for($a=1, $a<6)
print("Делай - ", $a)
end_cyc
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
end_thread
//===================== thr_teleport
Thread(thr_teleport,0)
waitms(100)
//wait(1)
for($a=1, $a<6)
print("Ляляля - ", $a)
end_cyc
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
end_thread
//===================== thr_run
Thread(thr_run,0)
waitms(100)
//wait(1)
for($a=1, $a<6)
print("Бубубу - ", $a)
end_cyc
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
end_thread
После "Начали" в логе, теоретически, должен быть один набор хрени типа Ляляля - х, но не тут то было, думаю разберетесь: в главном потоке в любом случае выполнится последний thr_run, даже если перед этим он уже выполнился. Но фишка еще в том, что потоки очень быстро отрабатывают и кажется, что они фигачат подряд без остановки. Попробуйте поставить задержку повыше в главном и посмотри, что происходит
Насчет сабов - они хороши, если существует 100% определенная последовательность действий. Т.е. сто пудов будет так, например: иду, собрал, атаковал, сел - и этот набор никогда не меняется. Но в вашем случае, я думаю, это не 100% :) Так же, как и у меня было :) По-любому выскочит какое-нибудь окно, проскочит левый цвет, или последовательность изменится. Поэтому пришлось делать что-то вроде этого:
SUB($trh, $name, $is_start)
$array[0] = "thr_looting"
$array[1] = "thr_teleport"
$array[2] = "thr_run"
for ($i = 0, $i < arrsize($array))
IF($array[$i] ! $name)
SETTHREAD ($array[$i], $is_start)
END_IF
end_cyc
END_SUB
Thread(thr_analys,1)
//wait(5)
waitms(100)
print("Проверяю, что делать")
$rand = RND(1,3)
SETTHREAD (thr_analys, 0)
//wait(2)
end_thread
//===================== thr_looting
Thread(thr_looting,1)
waitms(300)
//wait(1)
if ($rand = 1)
thr(thr_looting,0)
for($a=1, $a<6)
print("Лутаю - ", $a)
end_cyc
thr(thr_looting,1)
SETTHREAD (thr_analys, 1)
end_If
end_thread
//===================== thr_teleport
Thread(thr_teleport,1)
waitms(300)
//wait(1)
if ($rand = 2)
thr(thr_teleport,0)
for($a=1, $a<6)
print("Телепорт - ", $a)
end_cyc
thr(thr_teleport,1)
SETTHREAD (thr_analys, 1)
end_If
end_thread
//===================== thr_run
Thread(thr_run,1)
waitms(300)
//wait(1)
if ($rand = 3)
thr(thr_run,0)
for($a=1, $a<6)
print("Бегу - ", $a)
end_cyc
thr(thr_run,1)
SETTHREAD (thr_analys, 1)
end_If
end_thread
.