硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2334|回复: 3
收起左侧

[emWin] 关于使用多页贴图后内存不释放

[复制链接]

6

主题

24

回帖

6

积分

新手上路

积分
6
发表于 2017-2-15 15:29:06 | 显示全部楼层 |阅读模式
现在遇到一个问题:在使用多页贴图后,每进入退出一次,SDRAM使用量多出200多个字节,不会释放;如果屏蔽了代码中红色部分,SDRAM第一次调用后,不再增加。如果贴图不知如何释放每次多出来的SDRAM开销?
也使用过MULTIPAGE_SetBitmap()函数,效果一样,不释放。

代码如下:
页面创建:
WM_HWIN CreateSETTING(WM_HWIN hMWIN)
{

  hSWin = GUI_CreateDialogBox(_aDialogCreate1, GUI_COUNTOF(_aDialogCreate1), _cbDialog, hMWIN, 0, 0);
  return hSWin;
}
页面回调函数:
static void _cbDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  WM_HWIN hMultiPage;
  WM_HWIN hDialog;
  int     NCode;
  int     Id;
  // USER START (Optionally insert additional variables)
  // USER END

  switch (pMsg->MsgId) {
  case WM_INIT_DIALOG:
    //
    // Initialization of 'SETTING(define)'
    //
    hItem = pMsg->hWin;
    FRAMEWIN_SetTitleVis(hItem, 0);
    //
    // Initialization of 'Header'
    //
    hItem = WM_GetDialogItem(pMsg->hWin, ID_HEADER_0);
    HEADER_SetTextColor(hItem,GUI_WHITE);
    HEADER_SetBkColor(hItem,0x00a57001);
    HEADER_SetFont(hItem,GUI_FONT_32B_ASCII);//GUI_FONT_24B_ASCII
    HEADER_AddItem(hItem, 710, " ", GUI_TA_HCENTER|GUI_TA_VCENTER);
    HEADER_SetHeight(hItem,60);
    HEADER_SetItemText(hItem,0,"Quick Settings");

    hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0);
    BUTTON_SetBitmapEx(hItem,0,&bmreturn,1,1);
    BUTTON_SetBitmapEx(hItem,1,&bmreturn,1,1);
    BUTTON_SetBitmapEx(hItem,2,&bmreturn,1,1);
    BUTTON_SetFocussable(hItem,1);
    //
    // Initialization of 'Multipage'
    //
    hMultiPage = WM_GetDialogItem(pMsg->hWin, ID_MULTIPAGE_0);
    MULTIPAGE_SetTabHeight(hMultiPage, 90);
    MULTIPAGE_SetAlign(hMultiPage,MULTIPAGE_ALIGN_LEFT | MULTIPAGE_ALIGN_BOTTOM);
    MULTIPAGE_SetRotation(hMultiPage,MULTIPAGE_CF_ROTATE_CW);
    MULTIPAGE_SetFont(hMultiPage, GUI_FONT_24B_1);
    MULTIPAGE_EnableScrollbar(hMultiPage,0);

    hDialog = GUI_CreateDialogBox(_aQTSettingCreate,GUI_COUNTOF(_aQTSettingCreate),_cbQTSettingDialog,hSWin,0,0); //WM_UNATTACHED
    MULTIPAGE_AddPage(hMultiPage,hDialog,"");
    MULTIPAGE_SetTabWidth(hMultiPage, 208,0);
    MULTIPAGE_SetBitmapEx(hMultiPage,&bm21,0,0,0,MULTIPAGE_BI_SELECTED);
    MULTIPAGE_SetBitmapEx(hMultiPage,&bm22,0,0,0,MULTIPAGE_BI_UNSELECTED);


    hDialog = GUI_CreateDialogBox(_aUVSettingCreate,GUI_COUNTOF(_aUVSettingCreate),_cbUVSettingDialog,hSWin ,0,0); //WM_UNATTACHED
    MULTIPAGE_AddPage(hMultiPage,hDialog, "");
    MULTIPAGE_SetTabWidth(hMultiPage, 208,1);
    MULTIPAGE_SetBitmapEx(hMultiPage,&bm24,0,0,1,MULTIPAGE_BI_SELECTED);
    MULTIPAGE_SetBitmapEx(hMultiPage,&bm23,0,0,1,MULTIPAGE_BI_UNSELECTED);


    MULTIPAGE_SelectPage(hMultiPage,0);
    // USER START (Optionally insert additional code for further widget initialization)
    // USER END
    break;
  case WM_DELETE:
      hDialog = NULL;
      hMultiPage = NULL;
      hSWin = NULL;
      break;
case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_BUTTON_0: // Notifications sent by 'RETURN'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        GUI_EndDialog(pMsg->hWin,0);
        GUI_Delay(10);
        hItem = WM_GetActiveWindow();      
        WM_EnableWindow(
hItem);
        WM_SetFocus(hItem);
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_HEADER_0: // Notifications sent by 'Header'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_MOVED_OUT:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    case ID_MULTIPAGE_0: // Notifications sent by 'Multipage'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_RELEASED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_MOVED_OUT:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      case WM_NOTIFICATION_VALUE_CHANGED:
        // USER START (Optionally insert code for reacting on notification message)
        // USER END
        break;
      // USER START (Optionally insert additional code for further notification handling)
      // USER END
      }
      break;
    // USER START (Optionally insert additional code for further Ids)
    // USER END
    }
    break;
  // USER START (Optionally insert additional message handling)
  // USER END
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115728
QQ
发表于 2017-2-16 01:36:22 | 显示全部楼层
给这个多页对话框界面回调消息里面加上个WM_DELETE:,如果你关闭此对话框的时候,会进入到这个消息,然后你在这个消息里面
调用函数MULTIPAGE_DeletePage把所有创建的页都单独删除一遍,看看是否可行。
回复

使用道具 举报

6

主题

24

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2017-2-16 10:46:39 | 显示全部楼层
试过了,不行。不知为啥?
  case WM_DELETE:
      MULTIPAGE_DeletePage(WM_GetDialogItem(pMsg->hWin, ID_MULTIPAGE_0),0,1);
      MULTIPAGE_DeletePage(WM_GetDialogItem(pMsg->hWin, ID_MULTIPAGE_0),1,1);
      hDialog = NULL;
      hMultiPage = NULL;
      hSWin = NULL;
      break;
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115728
QQ
发表于 2017-2-17 09:15:50 | 显示全部楼层

回 waszhang 的帖子

waszhang:试过了,不行。不知为啥?
  case WM_DELETE:
      MULTIPAGE_DeletePage(WM_GetDialogItem(pMsg->hWin, ID_MULTIPAGE_0),0,1);
      MULTIPAGE_DeletePage(WM_GetDialogItem(pMsg->hWin, ID_MULT .. (2017-02-16 10:46) 
也许是个bug,后面我也测试下看看。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-5-14 20:29 , Processed in 0.210238 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表