Идеальная синхронизация - как?



  • Встала задача: 10 потоков. Каждый поток на определенном этапе запрашивает ручной ввод. Необходимо, чтобы скрипт автоматически проверял ввод данных в каждом из 10 потоков и после ввода в 10-м по счету потоке синхронно жал кнопку во всех 10 потоках.
    Пробовал через глобальную переменную с её увеличением после ввода текста в каждом потоке и когда она становилась равна 10, переходить к нажатию кнопок, но почему-то в некоторых потоках возникает задержка в 1-2 секунды, либо же все действия продолжают выполняться только в одном потоке, игнорируя оставшиеся 9. Пробовал метки и переходы по ним. Пробовал вызов функции в несколько потоков, но также если делать через IF, то либо получается ошибка когда условие равенства глобальной переменной не выполняется, либо если использовать метки, то данный поток имеет задержку перед другими..
    В общем, прошу помочь с указанием алгоритма, на котором можно реализовать такую синхронизацию.



  • @Mentall said in Идеальная синхронизация - как?:

    Встала задача: 10 потоков. Каждый поток на определенном этапе запрашивает ручной ввод. Необходимо, чтобы скрипт автоматически проверял ввод данных в каждом из 10 потоков и после ввода в 10-м по счету потоке синхронно жал кнопку во всех 10 потоках.
    Пробовал через глобальную переменную с её увеличением после ввода текста в каждом потоке и когда она становилась равна 10, переходить к нажатию кнопок, но почему-то в некоторых потоках возникает задержка в 1-2 секунды, либо же все действия продолжают выполняться только в одном потоке, игнорируя оставшиеся 9. Пробовал метки и переходы по ним. Пробовал вызов функции в несколько потоков, но также если делать через IF, то либо получается ошибка когда условие равенства глобальной переменной не выполняется, либо если использовать метки, то данный поток имеет задержку перед другими..
    В общем, прошу помочь с указанием алгоритма, на котором можно реализовать такую синхронизацию.

    Через глобальную переменную самый просто и наглядный вариант. Если скрипт работает не так, как вы ожидаете, смотрите условия работы с глобальной переменной, там ошибиться особо негде.

    Я бы вообще установил отдельный поток для изменения глобальной переменной, а остальные потоки в цикле бы ожидали это изменение.

    Да, минимальный сон в BAS составляет 1 секунду, то есть потоки начнут выполнять задачу от 0 до 1 секунды после изменения глобальной переменной. Если нужна задержка меньше, можете использовать node js или, например, действие "читать файл".



  • @Fox Извините за нескромность, но почему вы как админ не подписаны?



  • @DoctorKrolic said in Идеальная синхронизация - как?:

    @Fox Извините за нескромность, но почему вы как админ не подписаны?

    Потому что я не админ :D. Да и бейджики пропали после обновления форума



  • @Fox да, про возможность использования действий типа "читать файл" я не подумал. Спасибо! Покопаю в эту сторону. Со сном просто есть такая беда, что из-за сетевых задержек начало сна в потоках будет не одновременное, соответственно, на какие-то доли секунды будет отличаться и его окончание и срабатывание последующего действия.Вот если бы реализовать сон не по таймеру, а в зависимости от какого-то триггера, частоту запроса которого можно было бы настроить, было бы здорово.



  • @Mentall said in Идеальная синхронизация - как?:

    @Fox да, про возможность использования действий типа "читать файл" я не подумал. Спасибо! Покопаю в эту сторону. Со сном просто есть такая беда, что из-за сетевых задержек начало сна в потоках будет не одновременное, соответственно, на какие-то доли секунды будет отличаться и его окончание и срабатывание последующего действия.Вот если бы реализовать сон не по таймеру, а в зависимости от какого-то триггера, частоту запроса которого можно было бы настроить, было бы здорово.

    Если позволяет задача - используйте время. То есть если можно заранее, секунд за 5 знать, что нужно будет запустить выполнение задачи одновременно всем потокам, то можно просто каждому потоку вычесть текущее время из времени указанного в глобальной переменной и использовать результат в действии "сон"

    Про сон меньше секунды для цикла, можете прочитать тут
    https://community.bablosoft.com/topic/5643/как-спать-меньше-секунды


Log in to reply