@dilolo Спасибо, попробую
Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn
-
Все привет!
Разрабатываю софт для просмотра рекламы, который использует OpenVPN
Реализовал функцию которая запускается из main с помощью "Вызов функции в несколько потоков", в функции прописано условие, при котором должно происходить переключение vpn, я хочу реализовать что-то по типу ожидания завершения потоков, чтобы каждый поток завершил текущий просмотр и не начинал новый пока vpn не переключиться на новую конфигурацию. Моя реализация следующая:


Использовал тот же самый принцип с глобальными переменными, но для постоянного мониторинга выносил это в отдельную асинхронную функцию
Я считаю, что это достаточно криво и буду рад, если кто-то сможет подсказать более оптимальное решение -
Если делать по уму, то нужен массив в глобальной переменной или ресурсе, в котором каждый поток будет хранить своё состояние, а vpn-функция, на основании этого, будет решать, что ей делать.
-
@JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:
Я считаю, что это достаточно криво и буду рад, если кто-то сможет подсказать более оптимальное решение
Нет в BAS встроенных mutex.
Можешь оформить свое решение в виде модуля, будет выглядеть красиво, но под капотом будет все ровно тоже самое.
Я для себя так и сделал. Пока я не освобожу mutex, другие потоки ждут очереди, пока не смогут его захватить.
Так как у меня именованные mutex, то я могу городить их сколько угодно в своем коде с разными именами в разных местах.
С таким подходом есть подводные камни - если я не освобожу mutex. Например, будет ошибка в потоке, что его захватил, то все потоки будут вечно ждать.



-
@sergerdn То есть ты хочешь сказать, что мой алгоритм не так плох, но для удобства лучше обернуть это все в отдельный модуль? Просто я думал, что это своеобразный костыль и можно сделать как-то по другому, но в голову ничего другого не приходит
-
@JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:
@sergerdn То есть ты хочешь сказать, что мой алгоритм не так плох
Да.
@JImk4 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:
но для удобства лучше обернуть это все в отдельный модуль?
Да.
Но я это делаю в том числе, потому что можно написать отдельный тест на этот модуль.
Так как у меня ограниченные знания BAS, то я пишу функциональные тесты, чтобы проверить точно ли оно работает, как я ожидаю.Дополнительно нужда в блокировках не редкая вещь, поэтому можно таскать из проекта в проект однажды написанный модуль.
И обновление модуля тоже упрощенное, нужно всего лишь после обновления модуля открыть все проекты, что его используют и они его обновят автоматически из папки BAS.
В данном случае нужен тест точно ли происходит блокировка, то есть другие потоки ничего не делают, если какой-то поток не захватил mutex.
Хотя бы по логам будет видно.Я пишу множество логов, так как если обернуть функционал в модуль, то потеряются номера кубиков и в будущем будет сложно понять где что пошло не так. Да и вообще логи сильно помогают в поиске ошибок.
P.S.
Это на словах звучит все красиво, в реальности же у меня целый комбайн который обрабатывает код модуля после автоматического билда его в BAS. -
@JImk4 тестировал как-то многопоток с синхронизацией через ресурс, отказался в пользу глобальной переменной, но вам может подойти:
chkMultiTH.xml -
я бы наверное попросил админа реализовать такую штуку - чтобы по окончании какого-то определенного количества потоков их можно было паузнуть все, потом заменить впн(или прокси, или что там еще можно) и после этого, только после проверки пинга что "интернет опять есть"(потому что у меня например на серваке при переключении впн интернет подходит только через минуту-две, я хз почему) дальше продолжал работу
да, если будешь просить чтоб он это реализовал скажи чтоб еще тогда както это добавил в вариант если интернет пропал, чтоб они тоже останавливались и, возможно, алертовали что "мы перестали работать"
кстати, а как ты переключение впн реализовал из баса, подскажи. тоже думал над этим но пока не делали
-
@basuser123 said in Не могу продумать алгоритм, чтобы потоки останавливались, пока происходит переключение vpn:
я бы наверное попросил админа реализовать такую штуку
Мсье оптимист
:D -
M Moderator moved this topic from Off topic on