Всем привет, реанимирую топик )
@tanamir said in Корректная остановка BAS:
нажимает на Остановить->ждать каждый поток
Каким образом поток узнает о этом действии пользователя?
Вот надо же, только собрался писать свой первый суперсерьезный скрипт на БАСе, и уперся в эту же проблему... (
Захотел сделать так, чтобы из первого потока, в функции Main, цикл while(true) - запускал асинхронные функции с разными задачами. Цикл с задержкой, ну пусть с 1000 мс. сна, для примера. Ведь у асинхронных функций с задачами - время работы все равно намного дольше, это как правило. Для начала нужно, чтобы в цикле, каждую ~1 секунду проверялись результаты работы асинхронных функций, завершена ли задача, или ещё выполняется. Количество одновременно запущенных функций - регулировать динамически, из основного цикла, опираясь на указанное в ресурсах максимальное количество одновременно работающих потоков, отдельно для каждой задачи, и в зависимости от объема задач. Объем задач может меняться динамически, во время работы скрипта.
Останавливаю скрипт, выбирая: "ждать каждый поток" - а цикл как работал, так и работает. Как запускал новые функции асинхронно в других потоках - так и запускает, и останавливаться не хочет ))
Только останавливать принудительно. А это - чревато потерей данных и потенциальной потерей расходников, потому-что хз на каком этапе завершились потоки при принудительной остановке скрипта. Мне что, в файл писать каждое действие, чтобы потом при перезапуске скрипта - возобновлять работу функций с какого-то места? Скорее всего - начало основных действий писать в файл/базу придется, для продолжения работы после сбоя софта или перезагрузки машины. Но пока как-то не приоритет, да и сложновато на начальных этапах. Походу это замедлит скрипт, смотря какие действия сохранять, и с какой частотой. Хочется, конечно, максимальной отказоустойчивости, но не всё же сразу )))
Я конечно понимаю, что моя логика, возможно, немного расходится со стандартными подходами скриптописания на BAS, но разве я не могу в функциях, запущенных асинхронно, работать с разными профилями браузера - создавать новые, загружать уже сохраненные, вызывать другие функции с проверками и обработчиками для этого потока синхронно (или асинхронно, если надо), и уже чтобы потом, после получения нужного результата, эта асинхрорнная функция спокойно завершалась, сохраняя все нужные данные?
Просто захотелось навелосипедить для начала гулялку, чтобы была своя - самописная, для создания и прогрева профилей браузера с разными отпечатками(скоро приду за ключом для FS) и на разных проксях, и последующей работы из этих профилей с гуглом (ютубом).
Товарищи, за эти полгода ничего не поменялось? Неужели до сих пор нечего засунуть вместо true во while? Хотя судя по моей логике - мне только через break выходить, когда завершатся уже начатые задачи.
Неужели никак не узнать, что пользователь ожидает завершения скрипта, и что уже пора перестать запускать новые задачи из цикла, и завершить этот цикл?
Весь форум перекопал, не могу найти решение (
@UserTrue said in Корректная остановка BAS:
Как по вашему он должен понимать, что вам бы хотелось, что бы он закончил работу именно в "этом" месте и именно на 105 повторе цикла...
Получен сигнал завершения скрипта(узнали об этом при очередной итерации основного цикла скрипта в первом потоке) > Больше не запускаем новые задачи > Корректно завершили все начатые задачи > Вызвали Break - вышли из основного цикла > Успешное завершение скрипта
@tanamir said in Корректная остановка BAS:
Я понимаю так что если я нажал кнопку мягкого останова то должна установиться какая-то системная переменная например в true
Именно так я это и представляю )
Подскажите, пожалуйста - как быть. Рад любому совету, решению, ну или критике