韦德斯 2024-07-18 16:30 采纳率: 42.9%
浏览 127
已结题

lvgl多页面切换怎么做才不造成内存泄漏

我使用lvgl实现多页面切换的功能:
先创建全局变量,这里只放两个页面,因为我源代码有20个页面太冗杂:
static lv_obj_t * selscreen = NULL;
static lv_obj_t * setscreen = NULL;
然后再初始化它们:

static void create_selscreen()
{
  selscreen = lv_obj_create(NULL);

}

static void create_setscreen()
{
  setscreen = lv_obj_create(NULL);

}

最后用lv_scr_load();函数切换他们,但是没有用lv_obj_create();清除上一个页面的内容,因为如果使用lv_obj_create();的话,那么我切换回来时上一次页面内容就不见了,请问我只用lv_scr_load();这个方式会造成内存泄漏吗?或者说几十个页面的切换有什么更好的方式吗

  • 写回答

4条回答 默认 最新

  • 阿里嘎多学长 2024-07-18 16:38
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    在使用 LVGL 进行多页面切换时,确实需要注意内存管理,以避免内存泄漏。你当前的做法虽然可以正常显示页面,但确实存在一些潜在的问题。以下是一些建议和改进的方法:

    1. 使用 lv_obj_clean() 清除页面: 在切换页面时,可以使用 lv_obj_clean() 函数清除当前页面上的所有对象。这样可以避免内存泄漏,同时保留页面的初始状态。例如:

      void switch_to_selscreen() {
          lv_scr_load(selscreen);
          lv_obj_clean(setscreen);
      }
      
      void switch_to_setscreen() {
          lv_scr_load(setscreen);
          lv_obj_clean(selscreen);
      }
      
    2. 动态创建和删除页面: 如果你的应用程序确实需要频繁切换多个页面,可以考虑在每次切换时动态创建和删除页面。这样虽然会增加一些初始化的开销,但可以确保不会有内存泄漏。例如:

      void switch_to_selscreen() {
          if (setscreen) {
              lv_obj_del(setscreen);
              setscreen = NULL;
          }
          create_selscreen();
          lv_scr_load(selscreen);
      }
      
      void switch_to_setscreen() {
          if (selscreen) {
              lv_obj_del(selscreen);
              selscreen = NULL;
          }
          create_setscreen();
          lv_scr_load(setscreen);
      }
      
    3. 使用 lv_group 管理页面: LVGL 提供了 lv_group 功能,可以用来管理多个页面。通过将页面添加到同一个组中,可以使用 lv_group_focus() 来切换焦点,从而实现页面切换。这样可以避免频繁创建和删除页面,减少内存消耗。例如:

      static lv_group_t * g;
      static lv_obj_t * selscreen;
      static lv_obj_t * setscreen;
      
      void create_pages() {
          g = lv_group_create();
          lv_group_set_focus_cb(g, focus_cb);
      
          selscreen = lv_obj_create(NULL);
          setscreen = lv_obj_create(NULL);
      
          lv_group_add_obj(g, selscreen);
          lv_group_add_obj(g, setscreen);
      }
      
      void switch_to_selscreen() {
          lv_group_focus_obj(selscreen);
      }
      
      void switch_to_setscreen() {
          lv_group_focus_obj(setscreen);
      }
      
      static void focus_cb(lv_event_t * e) {
          lv_event_code_t code = lv_event_get_code(e);
          lv_obj_t * obj = lv_event_get_target(e);
          if (code == LV_EVENT_FOCUSED) {
              // 更新显示内容
          }
      }
      
    4. 优化内存使用: 如果页面内容复杂,可以考虑在页面切换时只更新必要的部分,而不是完全重新创建页面。这样可以减少内存消耗和初始化时间。

    5. 监控内存使用: 在开发过程中,可以使用工具如 Valgrind 或其他内存分析工具来监控内存使用情况,确保没有内存泄漏。

    通过以上方法,你可以更有效地管理多页面切换,避免内存泄漏,并提高应用程序的性能和稳定性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 7月31日
  • 已采纳回答 7月23日
  • 创建了问题 7月18日

悬赏问题

  • ¥15 Coze智能助手搭建过程中的问题请教
  • ¥15 12864只亮屏 不显示汉字
  • ¥20 三极管1000倍放大电路
  • ¥15 vscode报错如何解决
  • ¥15 前端vue CryptoJS Aes CBC加密后端java解密
  • ¥15 python随机森林对两个excel表格读取,shap报错
  • ¥15 基于STM32心率血氧监测(OLED显示)相关代码运行成功后烧录成功OLED显示屏不显示的原因是什么
  • ¥100 X轴为分离变量(因子变量),如何控制X轴每个分类变量的长度。
  • ¥30 求给定范围的全体素数p的(p-2)/p的连乘积值
  • ¥15 VFP如何使用阿里TTS实现文字转语音?