13
« 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