用C语言写一个事件驱动框架
时间: 2023-07-18 12:41:14 浏览: 53
好的,下面是一个简单的事件驱动框架的C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef struct event_t {
int type; // 事件类型
void* data; // 事件数据
} event_t;
typedef struct event_handler_t {
int type; // 处理的事件类型
void (*handler)(void*); // 处理函数
} event_handler_t;
#define MAX_EVENT_HANDLERS 50
event_handler_t event_handlers[MAX_EVENT_HANDLERS];
int num_event_handlers = 0;
void add_event_handler(int type, void (*handler)(void*)) {
if (num_event_handlers >= MAX_EVENT_HANDLERS) {
printf("Error: too many event handlers\n");
exit(1);
}
event_handlers[num_event_handlers].type = type;
event_handlers[num_event_handlers].handler = handler;
num_event_handlers++;
}
void remove_event_handler(int type, void (*handler)(void*)) {
int i;
for (i = 0; i < num_event_handlers; i++) {
if (event_handlers[i].type == type && event_handlers[i].handler == handler) {
// 将后面的元素依次向前移动
for (int j = i; j < num_event_handlers - 1; j++) {
event_handlers[j] = event_handlers[j + 1];
}
num_event_handlers--;
return;
}
}
}
void handle_event(event_t* event) {
int i;
for (i = 0; i < num_event_handlers; i++) {
if (event_handlers[i].type == event->type) {
event_handlers[i].handler(event->data);
}
}
}
int main() {
// 示例代码
add_event_handler(1, (void (*)(void *))printf);
add_event_handler(2, (void (*)(void *))puts);
event_t event1 = {1, "Hello, world!"};
event_t event2 = {2, "This is an event."};
handle_event(&event1);
handle_event(&event2);
return 0;
}
```
这个框架主要包含了三个部分:
1. `event_t` 结构体,表示一个事件,包含事件类型和数据。
2. `event_handler_t` 结构体,表示一个事件处理函数,包含处理的事件类型和函数指针。
3. `add_event_handler` 和 `remove_event_handler` 函数,用于添加和移除事件处理函数。
4. `handle_event` 函数,用于处理一个事件,将事件数据传递给所有处理该事件类型的函数。
在 `main` 函数中,我们可以使用 `add_event_handler` 函数添加事件处理函数,然后使用 `handle_event` 函数处理事件。
以上是一个简单的事件驱动框架的C语言实现,希望能对你有所帮助。