gpt4 book ai didi

c - Kaa 不发送事件

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:15 27 4
gpt4 key购买 nike

我已经设置了一个 Kaa 服务器并使用 SDK 开发了一个应用程序。但应用程序不发送事件消息。此应用程序应将进入 parking 场的汽车的车牌发送到服务器,并将事件发送到另一个应用程序(接收器应用程序)。应用程序向服务器发送数据但不发送事件。

有什么问题吗?

这是我的代码:

static void callback(void *context)
{
kaa_string_t plate;
kaa_user_log_record_t *log_record = kaa_logging_data_collection_create();
plate.data = "some license plate";
log_record->plate = &plate;
kaa_logging_add_record(kaa_client_get_context(context)->log_collector, log_record, NULL);
printf("%s uploaded\n", plate.data);

kaa_plate_detection_event_plate_event_t *plate_event = kaa_plate_detection_event_plate_event_create();
plate_event->plate = &plate;
kaa_error_t error_code = kaa_event_manager_send_kaa_plate_detection_event_plate_event(
kaa_client_get_context(context)->event_manager, plate_event, NULL);
//plate_event->destroy(plate_event);
printf("%s event sent\n", plate.data);
}

最佳答案

问题描述

callback() 的开头你定义了 kaa_string_t plate; ==>这意味着它的内存分配在堆栈上。

稍后在同一范围内,您将创建一个指向 plate_event 的指针,它将用作您要发送的事件的参数。

在发送事件之前,您要分配 plate_event->plate = &plate。这意味着 plate_event->plate 现在指向堆栈上的地址

然后,(根据您在评论中写的内容)您将使用异步函数 发送事件。这意味着正在执行这个函数的线程并不是在等待消息真正被发送——这就是异步函数的意义。其他东西(可能是不同的线程,取决于 send_event 函数的实现)将负责发送。因此,不能保证在执行下一行代码之前发送消息。

在您的情况下,很可能在发送消息之前,callback() 的范围结束了。因此这个scope的内存自动释放,从现在开始失效,包括kaa_string_t plate。然后在某个时候,异步发送正在执行,但它依赖于无效内存,因为现在 plate_event->plate 指向已释放的内存

可能的解决方案

不是在堆栈上分配 kaa_string_t plate,而是在堆上分配它 (malloc)。然后内存一直有效,直到您自己释放它,当您确定消息已发送时。

类似的东西:

kaa_string_t *plate = malloc(sizeof(kaa_string_t));
strncpy(plate, "some license plate", sizeof(kaa_string_t));
...
// Now it's safe to do this:
plate_event->plate = plate;
// Sending event code
...

关于c - Kaa 不发送事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44696767/

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