Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: ewa on February 02, 2019, 10:09:16 PM
-
Добрый день. Не разобрался с потоками.
Написан работающий скрипт, довольно длинный, с кучей циклов, основанных на анализе экрана. Всё работает. Здесь проблем нет.
Однако время от времени вылетает Adobe Flash Player. Об этом сообщает черный экран и характерная картинка по центру. По проверке на эту картинку можно определить падение флеша.
Но вставлять проверку на эту картинку во все свои многочисленные циклы не хотелось бы.
А хотелось бы, чтобы параллельно основному работал второй поток, который время от времени, например, каждую минуту, проверял бы на падение флеша. И если падение действительно случилось, то останавливал бы действия по первому потоку, производил бы определенные действия по перезапуску игры и снова включал бы первый поток.
И вот как это сделать, даже не предполагаю.
Upd. Вопрос по взаимодействию двух потоков. Чтобы второй мог останавливать (совсем останавливать, а не ПРИостанавливать) и запускать (с самого начала) первый поток.
-
пиши так, что бы скрипт не зацикливался на одном месте где нужна проверка)
-
Не вижу проблем.
Основной скрипт помести в поток 1, а поток 2 пусть делает проверку на краш Flash Player'а.
Вылет Flash Player'а необязательно проверять именно по картинке, я бы это сделал проверкой считывания заголовка окна о краше, так будет меньше нагрузка.
Тогда скрипт будет примерно такой:
THREAD(t1)
//здесь весь основной скрипт
END_THREAD
THREAD(t2) //поток проверки Adobe Flash Player'а на краш
IF(WNDFIND("Adobe Flash")>0) //если найдено окно с заголовком Adobe Flash
SETTHREAD(t1,0) //ставим поток t1 на паузу
//здесь действия по перезапуску игры
SETTHREAD(t1,1) //снимаем поток t1 с паузы
END_IF
WAIT(60) //периодичность проверки на краш Adobe Flash Player'а
END_THREAD
Точное наименование окна Adobe Flash, лучше уточнить в менеджере окон кликермана, когда произойдет краш.
-
Яндекс.Броузер нифига не пишет название окна типа "Adobe Flash...". Так что проверка краха будет по цвету экрана или картинке в центре. Это не проблема. Проблема в том, что мне надо совсем остановить первый поток. А потом его запустить с самого начала. Пауза не поможет, потому что я никогда не угадаю, в каком из многочисленных циклов первого потока случилась эта пауза и как после этого вернуть первый поток в рабочее состояние.
-
Ок. Тогда скрипт будет такой:
THREAD(t1)
//здесь весь основной скрипт
END_THREAD
THREAD(t2) //поток проверки Adobe Flash Player'а на краш
SETTHREAD(t1,0) //ставим поток t1 на паузу, чтобы GETSCREEN второго потока не пересекался с GETSCREEN первого
GETSCREEN
IF(PXL(100,100)=0) //если появился черный экран
SETTHREAD(t1,2) //ставим поток t1 на паузу, при последующем снятии с паузы поток начинает выполняться с начала, независимо от того, на какой инструкции тела он был остановлен
//здесь действия по перезапуску игры
SETTHREAD(t1,1) //снимаем поток t1 с паузы
END_IF
SETTHREAD(t1,1) //снимаем поток t1 с паузы
WAIT(60) //периодичность проверки на краш Adobe Flash Player'а
END_THREAD
-
Забыл написать, тебе нужен кликерман версии 4.12 или выше, т.к. более старые работают с setthread по другому.
-
Да-да, опции 2 в SETTHREAD я в хелпе не видел... Проверим...