gpt4 book ai didi

c - 在 C 中使用 event_new() 函数的 Event.h 库

转载 作者:行者123 更新时间:2023-11-30 16:30:19 26 4
gpt4 key购买 nike

首先,我不是程序员,我是做电气工程的。我做过一些编程,但永远不会说我是一个好的程序员。这个问题可能会被否决,但这没关系,因为我已经尝试这样做两个月了。

我对 event.h 一无所知,但我有一个可以工作并使用它的现有代码。它是这样的(我改变了一些东西来隐藏信息,但代码有效):

struct event_base   *base;
struct event *read_event;
struct event *signal_event;

typedef struct sample_ctx {
sens_handle_t *sens_handler;
sens_data_t data;
} sample_ctx_t;

// signal handler to break the event loop
void
signal_handler(evutil_socket_t sock, short event, void *user_data)
{
event_base_loopbreak(base);
}

// receive callback
void
sens_recv_cb(evutil_socket_t sock, short event, void *user_data)
{
static int i = 0;
int timeout = 0;

static struct timeval timestamp;
struct timeval timestamp2;
struct timeval diff;
sens_status_t status;
sample_ctx_t *ctx;

ctx = (sample_ctx_t *)user_data;

if (i == 0) {
gettimeofday(&timestamp, NULL);
i = 1;
}
status = sens_read(&ctx->data, ctx->sens_handler);


if ((status == SENS_SUCCESS) &&
!isnan(ctx->data.info1) &&
!isnan(ctx->data.info2) &&
!isnan(ctx->data.info3) &&
!isnan(ctx->data.info4)) {
fprintf(stderr, "%lf %lf %lf %lf\n",
ctx->data.info1,
ctx->data.info2,
ctx->data.info3,
ctx->data.info4);
gettimeofday(&timestamp, NULL);
} else {
gettimeofday(&timestamp2, NULL);

timersub(&timestamp2, &timestamp, &diff);

timeout = diff.tv_sec + (diff.tv_usec / 1000000);

}
}


int main()
{
int fd;

status_t status;


sample_ctx_t ctx;

memset(&ctx, 0, sizeof(ctx));


status = sensor_open(&fd, &ctx.gps_handler);
if (status != V2X_SUCCESS) {
fprintf(stderr, "Open failed ... sensor might not be running\n");
goto deinit_4;
}

base = event_base_new();
if (!base) {
fprintf(stderr, "Failed to create event base\n");
goto deinit_3;
}

// register for the read events
read_event = event_new(base, fd, EV_PERSIST|EV_READ, sens_recv_cb, &ctx);
if (!read_event) {
fprintf(stderr, "Failed to create read event\n");
goto deinit_2;
}

// register for the SIGINT signal on ctrl + c key combo
signal_event = evsignal_new(base, SIGINT, signal_handler, NULL);
if (!signal_event) {
fprintf(stderr, "Failed to create signal event\n");
goto deinit_1;
}

event_add(read_event, NULL);

evsignal_add(signal_event, NULL);

event_base_dispatch(base);

evsignal_del(signal_event);
deinit_1:
event_free(read_event);
deinit_2:
event_base_free(base);
deinit_3:
sensor_close(ctx.sens_handler);
deinit_4:
return 0;
}

此代码从传感器检索数据并将其打印到屏幕上。它的目的很简单,但实现的方式却很复杂;至少对我来说。

好的,所以在 sens_recv_cb 函数中,ctx->data 被打印到屏幕上,但我需要在主函数中访问它。该函数唯一一次被调用是在 main 中的 event_new 函数中。有没有办法在 main 中获取该数据?就像我只想在 main 中打印 ctx->data.info1 一样,同时仍然在 sens_recv_cb 函数中打印出之前的所有内容。

我想要做的事情可以在不更改整个代码的情况下实现吗?

最佳答案

由于 mainsens_recv_cb 是异步的,因此您需要一种在它们之间发出信号的方法以及一种用于回调存储数据的方法。您可以将两者与linked list结合起来。 :

struct node {
sample_ctx_t data;
struct node *next;
struct node *previous;
}
struct node *head = NULL;
struct node *tail = NULL;

事件处理程序将它们添加到列表的头部,而主函数将它们从尾部删除。这是一个先进先出。您需要使用atomic operations当向列表读取/写入数据时。这些链接提供了您需要了解的内容,如果您进行搜索,您会在这里和其他站点找到大量示例代码。您可能可以在 GitHub 上找到一个开源的、线程安全的链表实现。 .

基本上,当列表为空时,main 没有任何东西可以使用。

关于c - 在 C 中使用 event_new() 函数的 Event.h 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51217076/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com