Author Topic: Вопрос про потоки  (Read 2282 times)

0 Members and 2 Guests are viewing this topic.

sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Вопрос про потоки
« on: January 26, 2019, 11:58:59 PM »
Добрый день товарищи,имеется к вам такой вот интересный вопрос.

Есть скрипт,вот его суть :

Code: [Select]
Поток

getscreen

colormode(5,$x_sys_info-780,$y_sys_info+9,$x_sys_info-30,$y_sys_info+80)          //Таргеты

colormode(7,$x_obz_panel-21,$y_obz_panel+79+($vsegogaits*19),$x_obz_panel+2,$y_obz_panel+400)     //Полоска неписи   //

colormode(7,$x_name-7, $y_name+13,$x_type-9, $y_type+335) //Фракционник + суицидник

colormode(6,$x_sys_info-780,$y_sys_info+110,$x_sys_info-30,$y_sys_info+190)

waitms(500)
end_поток


Так же имеется цикл,для которого этот поток работает

Code: [Select]
вайл($что-то там=0)

подпрограмма 1

подпрограмма 2

подпрограмма 3

end_цикл

Поток делает анализ снимка экрана,а вайл,работая с потоком параллельно,берет этот анализ снимка и ищет последовательно подпрограммами свои цели.
Проблема в том,что иногда(8 из 10) случаем вайл берет информацию когда поток успел сделать гетскрин и 1 -2 колормода обработать(они ведь работают параллельно) и получается что все трещит по швам т.к подпрограммы думают что заданных целей для них нет.На скриншотах видно что я имею ввиду.Так вот,как это можно решить?Может как-то можно все колормоды одной программой задать вместе с гетскрином?Тогда либо новый отфильтрованный снимок уже есть,либо если программа не успела сделать новый - в буфере должен был остаться старый отфильтрованный.Можно конечно выкинуть поток в помойку и просто сделать это подпрограммой,но прелесть потока именно в параллельности,бот сможет гораздо быстрее отреагировать на всяких неожиданных гостей ,поскольку каждые полсекунды он сканирует наличие этих самых незваных гостей,в то время как подпрограмме пришлось бы ждать своей очереди на выполнение.Надеюсь кто-то с таким сталкивался и решение лежит на поверхности ,а я еще слишком зелен чтобы его самостоятельно увидеть)
« Last Edit: January 27, 2019, 12:01:09 AM by sektant23tm »

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Re: Вопрос про потоки
« Reply #1 on: January 27, 2019, 05:44:53 AM »
Выложи весь код какой он есть на самом деле
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Вопрос про потоки
« Reply #2 on: January 27, 2019, 11:17:29 AM »
Поток

Code: [Select]
THREAD(potok_comgetscreen,0)
                   
getscreen

colormode(5,$x_sys_info-780,$y_sys_info+9,$x_sys_info-30,$y_sys_info+80)          //Таргеты

colormode(7,$x_obz_panel-21,$y_obz_panel+79+($vsegogaits*19),$x_obz_panel+2,$y_obz_panel+400)     //Полоска неписи   //

colormode(7,$x_name-7, $y_name+13,$x_type-9, $y_type+335) //Фракционник + суицидник

colormode(6,$x_sys_info-780,$y_sys_info+110,$x_sys_info-30,$y_sys_info+190)

waitms(500)


END_THREAD 

Код вайла

Code: [Select]
//Включаем поток комгетскрина (тест)
SETTHREAD(potok_comgetscreen,1)

$cbabbing_plex="0"
$kolvotarget="0"

WHILE($cbabbing_plex = 0)

//Ищем фракционника
IF($dread = 0)

search_commandnpc()
END_IF
//Лочим цели


IF($kolvotarget <= 4)
target_lock()
END_IF
//Определяем сколько целей мы залочили
much_target()
IF($kolvotarget != 0)
//Ищем номер дрона
where_drones()
//Ищем номер миссла
where_missles()
//Подключаем логику
damage_logic()
wait(1)
END_IF
//Анализируем когда НПЦ все умрут + собираем дроны
the_end()

END_CYC

Все эти подсистемы не используют свой гетскрин,они лишь анализирую существующий в буфере через if_pixel_in или ip_pictures_in.Я несколько раз просмотрел их код и чтобы убедится что это точно так я каждую из них из кода удалял и смотрел как все отработает)

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопрос про потоки
« Reply #3 on: January 27, 2019, 11:24:25 AM »
Такой подход ничего не ускорит и добавит только проблем что и произошло.
И поток делающий подряд разные колормоды безсмысленнен, ты не будешь попадать на нужные большую часть времени. И как это помогает вовремя что-то отловить я не понимаю.
Для использования гетскрина в отдельном потоке (чтобы одновременно разные гетскрины не писали в буфер) нужно привести все поиски к одному колормоду если конечно возможно.
Или все делать в основном коде вместе с скринами.
Можно сделать 2 потока основнойи дополнительный. В дополнительном будут все основные действия.
В основном только отлов нужных окон. Постановка доп потока на паузу. Поиск со своим гетскрином и колормодом, отлавливание, новый гетскрин с колормода из основных действий для возврата буфера в предыдущее состояние. Снятие с паузы. Задержка, чтобы этот поиск не ожирал много времени. Область поиска, заготовки, размеры, всё минимизировать чтобы этот поток не сжирал время лопатой. И опять же по возможности привести к одному колормоду.


sektant23tm

  • Зашел в гости
  • *
  • Posts: 15
    • View Profile
Re: Вопрос про потоки
« Reply #4 on: January 27, 2019, 11:28:15 AM »
Скорость работы скрипта такой подход конечно же не ускорит,это правда.Но он очень поможет т.к. максимально быстро мог бы увидеть суицидников которые прилетят меня убивать и отреагировать на них)НАсчет двух поток я думал уже,тогда уж в моем случае проще просто поток превратить в подпрограмму.Жаль