野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15352|回复: 6

两个界面互相切换占用内存不释放这个怎么解决啊

[复制链接]
发表于 2016-11-15 21:22:18 | 显示全部楼层 |阅读模式
10火花
我有两个界面,界面1为主界面有个按钮用来切换到界面2,界面2 用来显示波形,同时有个按钮用来退出界面2进入界面1,但是相互切换若干次之后就会死机,查了一下是因为内存被用完了,界面2删除后没有释放内存,这个问题怎么解决啊

回复

使用道具 举报

 楼主| 发表于 2016-11-15 21:22:52 | 显示全部楼层
static void _cbCallback(WM_MESSAGE * pMsg) {
  unsigned i;
  int      NCode;
  int      Id;
  int      Value;
  WM_HWIN  hDlg;
  WM_HWIN  hItem;

  hDlg = pMsg->hWin;
       
  switch (pMsg->MsgId) {
               
  case WM_INIT_DIALOG: //3õê¼»ˉ¶Ô»°¿ò
                //éèÖÃ×ÖìåÑÕé«μè
                FRAMEWIN_SetText(hDlg, "WenDU_Window");
    FRAMEWIN_SetFont(hDlg, GUI_FONT_10_ASCII);
    FRAMEWIN_SetTextAlign(hDlg, GUI_TA_HCENTER | GUI_TA_TOP);
    FRAMEWIN_SetTextColor(hDlg, 0x006262FF);
          FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX);
        /*======================================================*/
      hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
       
            _ahData[0] = GRAPH_DATA_YT_Create(_aColor[0], 400, 0, 0);
                        _ahData[1] = GRAPH_DATA_YT_Create(_aColor[1], 400, 0, 0);
                        _ahData[2] = GRAPH_DATA_YT_Create(_aColor[2], 400, 0, 0);
            //Îa»æí¼¿Ø¼tìí¼ó¶ÔÏó
                        GRAPH_AttachData(WM_GetDialogItem(hItem, GUI_ID_GRAPH0), _ahData[0]);
                        GRAPH_AttachData(WM_GetDialogItem(hItem, GUI_ID_GRAPH0), _ahData[1]);
                        GRAPH_AttachData(WM_GetDialogItem(hItem, GUI_ID_GRAPH0), _ahData[2]);
    //
    // éèÖÃí¼DÎêôDÔ
    //
    GRAPH_SetGridDistY(hItem, 25);
    GRAPH_SetGridVis(hItem, 1);
    GRAPH_SetGridFixedX(hItem, 1);
    GRAPH_SetUserDraw(hItem, _UserDraw);
    //
    // ′′½¨oíìí¼ó′1Ö±3߶è
    //
                 
    _hScaleV = GRAPH_SCALE_Create( 25, GUI_TA_RIGHT, GRAPH_SCALE_CF_VERTICAL, 25);
                 GRAPH_DATA_XY_Clear(_hScaleV);
                 GRAPH_SCALE_SetTextColor(_hScaleV, GUI_YELLOW);
     GRAPH_AttachScale(hItem, _hScaleV);
    //
    // ′′½¨oíìí¼óˮƽ3߶è
    //
          
    _hScaleH = GRAPH_SCALE_Create(90, GUI_TA_HCENTER, GRAPH_SCALE_CF_HORIZONTAL, 50);
                 GRAPH_DATA_XY_Clear(_hScaleH);
    GRAPH_SCALE_SetTextColor(_hScaleH, GUI_DARKGREEN);
    GRAPH_AttachScale(hItem, _hScaleH);
    //
    // 3õê¼»ˉ¸′Ñ¡¿ò
    //
                CHECKBOX_SetDefaultSkin(CHECKBOX_SKIN_FLEX);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK2);
    CHECKBOX_SetText(hItem, "L");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK3);
    CHECKBOX_SetText(hItem, "T");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK4);
    CHECKBOX_SetText(hItem, "R");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK5);
    CHECKBOX_SetText(hItem, "B");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK0);
    CHECKBOX_SetText(hItem, "Stop");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK1);
    CHECKBOX_SetText(hItem, "Grid");
    CHECKBOX_SetState(hItem, 1);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK6);
    CHECKBOX_SetText(hItem, "HScroll");
    CHECKBOX_SetState(hItem, 1);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK7);
    CHECKBOX_SetText(hItem, "VScroll");
    hItem = WM_GetDialogItem(hDlg, GUI_ID_CHECK8);
    CHECKBOX_SetText(hItem, "MirrorX");
       
    //
    // 3õê¼»ˉ»¬¿é
    //
                SLIDER_SetDefaultSkin(SLIDER_SKIN_FLEX);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_SLIDER0);
    SLIDER_SetRange(hItem, 0, 10);
    SLIDER_SetValue(hItem, 5);
    SLIDER_SetNumTicks(hItem, 6);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_SLIDER1);
    SLIDER_SetRange(hItem, 0, 20);
    SLIDER_SetValue(hItem, 5);
    SLIDER_SetNumTicks(hItem, 6);
    //
    // 3õê¼»ˉμ¥Ñ¡¿ò
    //
                RADIO_SetDefaultSkin(RADIO_SKIN_FLEX);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_RADIO0);
    RADIO_SetText(hItem, "3D", 0);
    RADIO_SetText(hItem, "flat", 1);
    RADIO_SetText(hItem, "-", 2);
    //
    // 3õê¼»ˉ°′¼ü
    //
                BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX);
    hItem = WM_GetDialogItem(hDlg, GUI_ID_BUTTON0);
    WM_SetStayOnTop(hItem, 1);
                hItem = WM_GetDialogItem(hDlg, GUI_ID_BUTTON9);
    WM_SetStayOnTop(hItem, 1);
    break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);      // Id of widget
    NCode = pMsg->Data.v;                 // Notification code
    switch (NCode) {
    case WM_NOTIFICATION_CLICKED:
      switch (Id) {
      case GUI_ID_BUTTON0:
      _ToggleFullScreenMode(hDlg);
        break;
                        case GUI_ID_BUTTON9:
                        WM_DeleteWindow(hDlg_1);
                         break;
      }
      break;
    case WM_NOTIFICATION_VALUE_CHANGED:
      switch (Id) {
      case GUI_ID_CHECK0:
        _Stop ^= 1;
        break;
      case GUI_ID_CHECK1:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        GRAPH_SetGridVis(hItem, CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK1)));
        break;
      case GUI_ID_CHECK2:
      case GUI_ID_CHECK3:
      case GUI_ID_CHECK4:
      case GUI_ID_CHECK5:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        GRAPH_SetBorder(hItem,
                        CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK2)) * 40,
                        CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK3)) * 5,
                        CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK4)) * 5,
                        CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK5)) * 5);
        break;
      case GUI_ID_SLIDER0:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        Value = SLIDER_GetValue(pMsg->hWinSrc) * 10;
        GRAPH_SetGridDistX(hItem, Value);
        GRAPH_SCALE_SetTickDist(_hScaleH, Value);
        break;
      case GUI_ID_SLIDER1:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        Value = SLIDER_GetValue(pMsg->hWinSrc) * 5;
        GRAPH_SetGridDistY(hItem, Value);
        GRAPH_SCALE_SetTickDist(_hScaleV, Value);
        break;
      case GUI_ID_RADIO0:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        switch (RADIO_GetValue(pMsg->hWinSrc)) {
        case 0:
          WIDGET_SetEffect(hItem, &WIDGET_Effect_3D);
          break;
        case 1:
          WIDGET_SetEffect(hItem, &WIDGET_Effect_Simple);
          break;
        case 2:
          WIDGET_SetEffect(hItem, &WIDGET_Effect_None);
          break;
        }
        break;
      case GUI_ID_CHECK6:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK6))) {
          GRAPH_SetVSizeX(hItem, 500);
        } else {
          GRAPH_SetVSizeX(hItem, 0);
        }
        break;
      case GUI_ID_CHECK7:
        hItem = WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK7))) {
          GRAPH_SetVSizeY(hItem, 300);
        } else {
          GRAPH_SetVSizeY(hItem, 0);
        }
        break;
      case GUI_ID_CHECK8:
        WM_GetDialogItem(hDlg, GUI_ID_GRAPH0);
        for (i = 0; i < GUI_COUNTOF(_aColor); i++) {
          if (CHECKBOX_IsChecked(WM_GetDialogItem(hDlg, GUI_ID_CHECK8))) {
            GRAPH_DATA_YT_SetAlign(_ahData[i], GRAPH_ALIGN_LEFT);
            GRAPH_DATA_YT_MirrorX (_ahData[i], 1);
          } else {
            GRAPH_DATA_YT_SetAlign(_ahData[i], GRAPH_ALIGN_LEFT);
            GRAPH_DATA_YT_MirrorX (_ahData[i], 0);
          }
        }
        break;
      }
      break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
  }
}
回复

使用道具 举报

 楼主| 发表于 2016-11-15 21:23:17 | 显示全部楼层
1fwf.png
回复

使用道具 举报

 楼主| 发表于 2016-11-15 21:24:17 | 显示全部楼层
加上上面的语句之后就会每切换一次,内存减少一次
回复

使用道具 举报

发表于 2016-11-16 10:15:38 | 显示全部楼层
滨院小韩 发表于 2016-11-15 21:24
加上上面的语句之后就会每切换一次,内存减少一次

作为局部变量使用不是会自动释放的吗
回复

使用道具 举报

发表于 2017-2-9 11:16:54 | 显示全部楼层
兄弟我也遇到同样的问题了,你的问题解决了吗?
我是一个页面创建一个多页,多页标题栏贴图,进入这个页面和退出每次会增加300多字节,重复进入退出8次,点击退出就退不出了,监控到退出那个pMSG->hWinSrc =0;了。如果把下面代码中多页的四个贴图屏蔽掉进入和退出RAM不会增加。
  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);
       
        hDialog1 = GUI_CreateDialogBox(_aQTSettingCreate,GUI_COUNTOF(_aQTSettingCreate),_cbQTSettingDialog,hSWin,0,0); //WM_UNATTACHED
        MULTIPAGE_AddPage(hMultiPage,hDialog1,"Quick Settings");
        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);

//       
        hDialog2 = GUI_CreateDialogBox(_aUVSettingCreate,GUI_COUNTOF(_aUVSettingCreate),_cbUVSettingDialog,hSWin ,0,0); //WM_UNATTACHED
        MULTIPAGE_AddPage(hMultiPage,hDialog2, "Universal Settings");
        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);
回复

使用道具 举报

发表于 2017-2-16 13:45:28 | 显示全部楼层
启动文件中的堆和栈的设置如下:
Stack_Size      EQU     0x00000800
Heap_Size       EQU     0x00000400  
回复

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-12-28 00:04 , Processed in 0.051636 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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