спать в функции, но не блокировать другие функции и код - PullRequest
0 голосов
/ 03 мая 2018

Я на модуле / микроконтроллере esp8266. Я никогда не писал на C ++. Теперь я пытаюсь вставить свою маленькую «неблокирующую» функцию в один файл. Моя функция должна подождать 5 секунд на фоне и затем что-то напечатать. Но я не хочу откладывать полную инициализацию meInit () на 5 секунд, это должна быть, скажем, параллельная «неблокирующая» функция. Как это возможно, пожалуйста?

void meInit()
{ 
  if (total > 20) total = 20;
  value = EEPROM.read(1);

  Serial.begin(115200);
  Serial.setTimeout(10);

  loadSettings(true);

  buildMe();

  initFirst();

  //here I need to call "non-blocking" function with no delay and process immediatelly further
  call5sFunct();  

  ...do other functions here immediatelly without 5s delay...
}

void call5sFunct()
{
  Sleep(5000);

  DEBUG_PRINTLN("I am back again");
}

P.S. короткий образец высоко ценится :) THX

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Вы не должны вообще спать, а просто вызывать свою функцию через 5 секунд, в функции цикла. Примерно так (не проверено):

unsigned long start_time = 0;
bool call5sFunct_executed = false;

void meInit()
{ 
  if (total > 20) total = 20;
  value = EEPROM.read(1);

  Serial.begin(115200);
  Serial.setTimeout(10);

  loadSettings(true);

  buildMe();

  initFirst();

  // You cannot call it here, but in loop()
  // call5sFunct();  

  // ...do other functions here immediatelly without 5s delay...
}

void call5sFunct()
{
  DEBUG_PRINTLN("I am back again");
}

void loop()
{
   unsigned long loop_time = millis();
   if (!call5sFunct_executed && (loop_time - start_time >= 5000))
   {
      call5sFunct();
      call5sFunct_executed = true;
   }
   // .... the rest of your loop function ...
}

Однако этот шаблон должен широко использоваться для программирования микроконтроллеров. Было бы действительно неудобно и подвержено ошибкам писать такой код, но важно, чтобы вы поняли.

Есть много библиотек, которые облегчают реализацию асинхронных операций на Arduino, скрывая этот механизм. Например, взгляните на TaskScheduler .

Google для "Arduino асинхронных функций", и вы найдете много альтернатив.

0 голосов
/ 03 мая 2018

Используйте std::thread для запуска call5sFunct(); в другом потоке, например:

//...
initFirst();

//here I need to call "non-blocking" function with no delay and process immediatelly further
std::thread t1(call5sFunct);
t1.detach();  
...do other functions here immediatelly without 5s delay...

//...

Вам необходимо включить #include <thread>

...