Можно ли использовать библиотеку TimedAction для вызова функций объекта?
В настоящее время программа, использующая TimedAction для функции, будет выглядеть так:
#include <TimedAction.h>
void functionX();
TimedAction funtionTimed = TimedAction(1000, functionX);
void setup()
{
}
void loop()
{
functionTimed.check();
}
void functionX()
{
//run function
}
Мой вопрос: допустим, у меня есть класс объектов с некоторыми функциями, которые я хотел бы использовать с этой библиотекой TimedAction. Как это будет написано?
@walkman118, 👍2
1 ответ
Вы не можете. Класс TimedAction не поддерживает прототип функции, необходимый для вашего неопределенного класса (он должен соответствовать вашему классу, поэтому не может быть написан).
Вам необходимо вызвать обычную функцию, которая затем вызовет функцию класса, или вам необходимо сделать функцию класса статической
, чтобы она не включала класс в прототип функции.
class foo {
public:
static void runMe() {
// бла-бла
}
};
TimedAction funtionTimed = TimedAction(1000, foo::runMe);
Однако TimedAction довольно прост и вам он не нужен. Вы можете просто написать функцию, которая будет запускаться только время от времени:
class foo {
private:
uint32_t _runMeTimestamp;
public:
void runMe() {
if (millis() - _runMeTimestamp < 1000) return;
_runMeTimestamp = millis();
// бла-бла
}
};
foo myFoo;
void loop() {
myFoo.runMe();
}
Эти две строки кода, а также переменная для хранения временной метки — все, что вам нужно, чтобы функция запускалась через определенные промежутки времени.
- запрос «атрибута» члена в «объекте», который имеет неклассовый тип «int»
- Обнаружение близости различных объектов
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
Спасибо, да, я использовал его для вызова обычной функции, которая затем вызывает функцию класса, просто было интересно, смогу ли я уменьшить избыточность., @walkman118
Protip: Вы можете переписать библиотеку, чтобы использовать
std::function
вместо простых указателей на функции. Затем вы можете использовать лямбда-выражения илиstd::bind
для вызова функции-члена определенного объекта. Это будет способом C++ сделать это., @Maximilian Gerhardt