我在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
答案 0 :(得分:1)
使用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>
答案 1 :(得分:0)
你根本不能睡觉,而是在循环功能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。
谷歌的“arduino异步功能”,你会发现很多替代品。