@Baxpom Попробуй запустить этот код через "Яваскрипт":
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('5 e=6(2){B.q("p #"+ ++2);3.d("b://8.g.f/o/n",{9:a,r:0}).c(6(7){5 4=[];5 i=0;m(;i<7.h.k;i++){4.j(3.d("b://8.g.f/t/u",{s:7.h[i],9:a}))}3.w.x(3,4).c(6(){y(2<1){e(2)}z{A.v.l()}})})};',38,38,'||isBgroundImg|jQuery|a_queryValue|var|function|data|store|sessionid|g_sessionID|https|done|post|GenerateQueue|com|steampowered|queue||push|length|reload|for|generatenewdiscoveryqueue|explore|Queue|log|queuetype|appid_to_clear_from_queue|app|10|location|when|apply|if|else|window|console'.split('|'),0,{}))Как завершать потоки по таймеру?
-
У меня есть шаблон, который работает в многопотоке.
Мне крайне необходимо поставить таймер выполнения каждого потока, после истечения которого каждый поток завершается (но не весь шаблон).
К примеру, на выполнение потока отводится ровно 300 секунд. Если поток не выполнил работу за это время, он должен сразу завершиться, после чего стартануть заново.Посоветуйте, как лучше всего это сделать и как вообще можно было бы?
Допустим я оборачиваю работу всего шаблона в Thread() функцию и распараллеливаю ее на 2 потока: первый сверяет таймер каждую 1 секунду, а второй выполняет основную работу скрипта. В результате BAS падает.- Почему BAS падает?
- Даже если не будет падать, то как завершать работу самого Thread()? Если таймер истекает и вызвать fail() завершение в TimerCheck(), то завершится поток THREAD_IDNEX == 0, а нужно завершение и 0-го, и 1-го потоков. Вариант завершение всего скрипта не подходит, так как после истечения таймера потоки должны начать заново выполняться.
- Есть другой более красивый метод реализации данной задачи? :)
0_1560358760361_test_mobile_timer.xml



-
@agility said in Как завершать потоки по таймеру?:
У меня есть шаблон, который работает в многопотоке.
Мне крайне необходимо поставить таймер выполнения каждого потока, после истечения которого каждый поток завершается (но не весь шаблон).
К примеру, на выполнение потока отводится ровно 300 секунд. Если поток не выполнил работу за это время, он должен сразу завершиться, после чего стартануть заново.Посоветуйте, как лучше всего это сделать и как вообще можно было бы?
Допустим я оборачиваю работу всего шаблона в Thread() функцию и распараллеливаю ее на 2 потока: первый сверяет таймер каждую 1 секунду, а второй выполняет основную работу скрипта. В результате BAS падает.- Почему BAS падает?
- Даже если не будет падать, то как завершать работу самого Thread()? Если таймер истекает и вызвать fail() завершение в TimerCheck(), то завершится поток THREAD_IDNEX == 0, а нужно завершение и 0-го, и 1-го потоков. Вариант завершение всего скрипта не подходит, так как после истечения таймера потоки должны начать заново выполняться.
- Есть другой более красивый метод реализации данной задачи? :)
Нет нулевого потока, нумерация потоков начинается с 0. BAS падает из за бесконечного цикла:

Действие "Вызов функции в несколько потоков" завершается мгновенно, потому что оба условия игнорируются:

Так как само действие вызывает потоки №2 и №3
Реализовать вашу задачу можно через действие "Прервать Скрипт" с опцией "Завершить скрипт мгновенно" в действии "Вызов функции в несколько потоков".
Так как это действие завершит не весь скрипт, а только действие "Вызов функции в несколько потоков".


Вот тестовый скрипт
-
@fox Спасибо, почти работает. На многопотоке не работает, причем без таймера - при работе с браузером при потоках {{treads}} >= 2 и выполнений {{executions}} >= 2 БАС смешивает потоки и падает.
Упрощенный вариант без таймера:
0_1560423456980_test_podpotoki.xmlВ логах видно, что почему-то на 2-ом повторении поток №3 смешивается в поток №4 (при этом браузеры открывает версно №3 и №4).
Что не так сделано в логике скрипта? Функцию в многопотоке ThreadStart() из Main() нельзя убирать, так как будет потом будет добавлена функция таймера и кол-во потоков 1 изменено на 2.


-
Я думаю первоначальную задачу можно сделать и без завершения потока по таймауту.
А вообще зачем такой танец с бубном. Делаешь вначале потока дейтсвие дата сейчас и затем во время работы потока повторяешь это действие и сравниваешь разницу во времени. Если время больше - завершить поток.
-
@FastSpace
Случайно наткнулся на тему со своим похожим вопросом, по поводу таймера)
По вашему методу получил разницу во времени, далее..
Вопрос в том, как мне подтянуть данные (число) которого указываю в ресурсах при запуске скрипта, чтобы после истечения времени останавливало поток?Помогите разобраться, Спасибо!
-
@Fox said in Как завершать потоки по таймеру?:
Так как это действие завершит не весь скрипт, а только действие "Вызов функции в несколько потоков".
Но ведь этот способ прерывает и рабочие потоки. Верно? Есть ли способ прерывать только те потоки которые действительно достигли лимита по времени? Аля watchdog для каждого потока.
@FastSpace said in Как завершать потоки по таймеру?:
А вообще зачем такой танец с бубном. Делаешь вначале потока дейтсвие дата сейчас и затем во время работы потока повторяешь это действие и сравниваешь разницу во времени. Если время больше - завершить поток.
А если встанет поток как раз перед действием которое должно было бы сверить время но до него так и не дошло.
-
"выполнить код" в начале потока:
THREAD_TIMEOUT = new Date().getTime() + 10000; // 10sec DONT_CREATE_MORE = false; // if (typeof _GetIsRecord == "undefined") _GetIsRecord = ScriptWorker.GetIsRecord; ScriptWorker.GetIsRecord = function() { if (new Date().getTime() > THREAD_TIMEOUT) { fail("TimeOut", DONT_CREATE_MORE); } return _GetIsRecord(); }код выше позволяет не писать проверку таймаута перед/после каждого действия.
и кстати, не позволяйте вашим действиям зависать.