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

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

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


Вот тестовый скрипт