Запуск параллельных потоков из setup, не из loop?

Работаю с внешними устройствами. Мне нужно одновременно выполнить несколько команд. Я решил воспользоваться библиотекой ArduinoThread. Делаю всё как в примере, но если я хочу запустить только один раз, из setup() - ничего не происходит.

В примере перемещение controll.run(); в setup() не помешало работе, а в случае вызова функции из другой библиотеки - ничего не происходит. Если в loop - то всё нормально.

Что делать? Приму любые советы.
  • Вопрос задан
  • 1055 просмотров
Пригласить эксперта
Ответы на вопрос 1
riky
@riky
Laravel
когда то давным давно тоже делал библиотеку для псевдопотоков.
controll.run(); должен быть в loop.
вы же понимаете что никакой многопоточности в ардуино быть не может. controll.run в каждой итерации loop проверяет все подключенные обработчики/thread и если пришло их время запускает эти функции. никакого волшебства, ровно как и никаких реальных потоков.

если вы не вызываете controll.run в loop то эти обработчики никогда не будут запущены.

также учтите что код в обработчиках не выполняется параллельно!!!
то есть если 2 функции(thread) которые там добавлены выполняются каждая по 1 секунде (например они содержат sleep внутри себя) то они будут выполнены ровно по очереди и вместе будут выполняться 2 секунды, а не 1 секунду как было бы при честной многопоточности.

либо еще вариант делать их запуск по условию
initTime = millis() + 5000;

loop() {
   if (millis() < initTime) {
      controll.run(); 
  }
}


controll.run будет запускаться только первые 5 сек. если вы не хотите получить лишние накладные расходы при обычной работе после запуска.

UPD: читайте как работают EventLoop в любых языках программирования и библиотеках.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы