遇到某些传感器触发后操作功能 回调函数会多次触发
1.使用闭包:闭包是一个函数和其相关的引用环境的组合。通过将回调函数作为参数传递给另一个函数,并在该函数内部定义一个闭包来保存该回调函数及其引用环境,可以确保回调函数只被触发一次。
2.使用计数器:可以在回调函数中添加一个计数器,每次调用回调函数时递增计数器的值。当计数器的值达到指定阈值时,停止调用回调函数。这种方法需要手动维护计数器的值,并且可能会导致性能问题。
3.使用状态机:状态机是一种用于处理事件和状态转换的模型。可以将回调函数作为状态机的事件处理程序,并在每个状态转换时检查是否已经触发了回调函数。如果已经触发了回调函数,则不再执行该回调函数。这种方法需要手动实现状态机,并且可能会导致代码复杂度增加。
无论使用哪种方法,都需要仔细考虑如何设计和实现回调函数以确保它们只被触发一次。
闭包:
#include <stdio.h>
// 定义一个闭包函数,用于保存回调函数及其引用环境
typedef void (*Callback)(int);
void callback_wrapper(Callback callback, int count) {
if (count == 0) {
// 如果计数器为0,则执行回调函数
callback(count);
} else {
// 否则递归调用自身,并将计数器减1
callback_wrapper(callback, count-1);
}
}
// 定义一个回调函数,用于在计数器为0时执行
void my_callback(int count) {
printf("Callback called with count %d\n", count);
}
int main() {
int counter = 5;
// 将回调函数和计数器作为参数传递给闭包函数
callback_wrapper(my_callback, counter);
return 0;
}
状态机:
#include <stdio.h>
#include <stdlib.h>
typedef enum {
STATE_IDLE,
STATE_WALKING,
STATE_RUNNING,
STATE_JUMPING,
STATE_FALLING
} State;
typedef struct {
State state;
} StateMachine;
void handle_event(StateMachine *sm, int event) {
switch (event) {
case 1:
sm->state = STATE_WALKING;
break;
case 2:
sm->state = STATE_RUNNING;
break;
case 3:
sm->state = STATE_JUMPING;
break;
case 4:
sm->state = STATE_FALLING;
break;
default:
printf("Unknown event\n");
}
}
int main() {
StateMachine sm;
sm.state = STATE_IDLE;
int event;
while (1) {
printf("Current state: %d\n", sm.state);
scanf("%d", &event);
handle_event(&sm, event);
}
return 0;
}