进行删除控件时候,代码崩溃

lv_obj_del_async(obj_dialog);和 lv_obj_del(obj_dialog);都会概率性的导致代码崩溃。

请问有同学遇到类似问题吗?都是怎么解决的?

具体要看你的代码是怎么编写的,这种问题一般都是由于在对象被删除了之后仍在继续使用该对象的指针导致的

void Prompt::ShowDialogBox(lv_event_cb_t event_cb_1, lv_event_cb_t event_cb_2, const char *text_1, const char *text_2)

{

lv_obj_t *obj;

lv_obj_t *obj_bg;

lv_color_t color;

lv_color_t text_color;

text_color.full = 0xffffffff;

color.full = 0xFF000000;

if (obj_info)

{

    pthread_mutex_lock(&lock);

    lv_obj_del(obj_info);

    obj_info = NULL;

    pthread_mutex_unlock(&lock);

}

if (obj_dialog)

{

    pthread_mutex_lock(&lock);

    lv_obj_del(obj_dialog);

    obj_dialog = NULL;

    pthread_mutex_unlock(&lock);

}

obj_dialog = obj = lv_obj_create(lv_scr_act());

lv_obj_clear_flag(obj_dialog, LV_OBJ_FLAG_SCROLLABLE);

lv_obj_set_size(obj, LV_HOR_RES, LV_VER_RES);

lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);

lv_obj_set_style_bg_color(obj, color, 0);

lv_obj_set_style_border_color(obj, color, 0);

lv_obj_set_style_radius(obj, 0, 0);

lv_obj_set_style_bg_opa(obj, LV_OPA_60, 0);

lv_obj_add_event_cb(obj, event_cb_1, LV_EVENT_CLICKED, NULL);

static lv_style_t style;

lv_style_init(&style);

lv_style_reset(&style); // 重置样式

lv_style_set_radius(&style, 0); // 设置样式圆角弧度

lv_style_set_bg_opa(&style, LV_OPA_80); // 设置样式背景的透明度,不透明

color.full = 0xFF020D10;

lv_style_set_bg_color(&style, color);

color.full = 0xFFffffff;

lv_style_set_border_color(&style, color); // 设置样式边框颜色为黑色

lv_style_set_border_width(&style, 3); // 设置边框宽度

lv_style_set_border_opa(&style, LV_OPA_100);  // 设置边框透明度

lv_style_set_border_side(&style, LV_BORDER_SIDE_FULL);



obj_bg = obj = lv_obj_create(obj);

lv_obj_add_style(obj, &style, 0); // 给对象添加样式

lv_obj_set_size(obj, 600, 340);

lv_obj_center(obj);

lv_obj_set_scrollbar_mode(obj_bg, LV_SCROLLBAR_MODE_OFF);

lv_obj_clear_flag(obj_bg,LV_OBJ_FLAG_SCROLLABLE);

text_color.full = 0xffffffff;

obj = lv_label_create(obj_bg);



lv_obj_set_style_text_font(obj, &lv_font_montserrat_28, 0);

lv_obj_set_size(obj, 600, 100);

lv_label_set_long_mode(obj, LV_LABEL_LONG_WRAP);

lv_obj_set_style_text_align(obj,LV_TEXT_ALIGN_CENTER,0);

lv_obj_set_style_text_color(obj, text_color, 0);

lv_obj_align(obj, LV_ALIGN_CENTER, 0, -20);

lv_label_set_text(obj, text_2);

obj = lv_btn_create(obj_bg);

lv_obj_set_style_bg_color(obj,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_PRESSED);

lv_obj_set_style_bg_color(obj,color,LV_STATE_DEFAULT);

lv_obj_add_event_cb(obj, event_cb_2, LV_EVENT_CLICKED, (void *)0);

lv_obj_set_size(obj, 220, 60);

lv_obj_align(obj, LV_ALIGN_LEFT_MID, 10, 120);

obj = lv_label_create(obj);

lv_obj_set_style_text_font(obj, &lv_font_montserrat_28, 0);

text_color.full = 0xff313131;

lv_obj_set_style_text_color(obj, text_color, 0);

if(SystemConfig::GetInstance()->GetSystemConfig(SYSTEM_CONFIG_SYSTEM_LANGUAGE) == 6)

{

    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 12);

}else{

    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);

}

lv_label_set_text(obj, Font::GetStr(RES_STR_SETTINGS_BOX_OK));

obj = lv_btn_create(obj_bg);

lv_obj_set_style_bg_color(obj,lv_palette_main(LV_PALETTE_BLUE),LV_STATE_PRESSED);

lv_obj_set_style_bg_color(obj,color,LV_STATE_DEFAULT);

lv_obj_add_event_cb(obj, event_cb_1, LV_EVENT_CLICKED, (void *)0);

lv_obj_set_size(obj, 220, 60);

lv_obj_align(obj, LV_ALIGN_RIGHT_MID, -10, 120);

obj = lv_label_create(obj);

lv_obj_set_style_text_font(obj, &lv_font_montserrat_28, 0);

text_color.full = 0xff313131;

lv_obj_set_style_text_color(obj, text_color, 0);

if(SystemConfig::GetInstance()->GetSystemConfig(SYSTEM_CONFIG_SYSTEM_LANGUAGE) == 6)

{

    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 12);

}else{

    lv_obj_align(obj, LV_ALIGN_CENTER, 0, 0);

}

lv_label_set_text(obj, Font::GetStr(RES_STR_SETTINGS_BOX_CANCEL));

}

void Prompt::DeleteDialogBox()

{

if (obj_dialog)

{

    pthread_mutex_lock(&lock);

    lv_obj_del_async(obj_dialog);

    obj_dialog = NULL;

    pthread_mutex_unlock(&lock);

}

}
以上是代码
Thread 1 “cvr_app” received signal SIGSEGV, Segmentation fault.
0xa6b5d278 in _lv_event_mark_deleted () from /usr/lib/liblvgl.so
这个是报错信息

应该有一个锁用在维持 lvgl 心跳和删除对象操作之间(不同线程)。也就是执行删除操作和lvgl心跳维持是互斥的。还有一些其他注意点,你可以阅读这里的文档了解: http://lvgl.100ask.net/8.2/porting/os.html?highlight=%E7%BA%BF%E7%A8%8B#tasks-and-threads

看了下,好像没有太明白,有没有相关案例,参考一下,谢谢啦

这个没有使用多线程

请问一下这个问题有后续吗,是怎么解决的?

del对象之前,先 lv_obj_remove_event_cb 看看