硬汉嵌入式论坛

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

[emWin] 两个界面切换每切换一次占用我一次内存

[复制链接]

1

主题

5

回帖

16

积分

新手上路

积分
16
发表于 2016-11-15 21:02:31 | 显示全部楼层 |阅读模式
我建立了两个框架,框架1为主页面,框架2为另一个页面,我要做的就是通过主页面的一个按钮切换到框架2的页面,然后通过框架2的一个按钮切换到主页面。框架2中有一个GRAPH,想要显示一些数据。但是每次切换之后,我发现我的内存随着切换而减少,最终死机[s:125],这特么是什么原因啊,
回复

使用道具 举报

1

主题

5

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2016-11-15 21:02:59 | 显示全部楼层
我建立了两个框架,框架1为主页面,框架2为另一个页面,我要做的就是通过主页面的一个按钮切换到框架2的页面,然后通过框架2的一个按钮切换到主页面。框架2中有一个GRAPH,想要显示一些数据。但是每次切换之后,我发现我的内存随着切换而减少,最终死机[s:125],这特么是什么原因啊,
回复

使用道具 举报

1

主题

5

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2016-11-15 21:04:19 | 显示全部楼层
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, GRAPH_ALIGN_LEFT);
            GRAPH_DATA_YT_MirrorX (_ahData, 1);
          } else {
            GRAPH_DATA_YT_SetAlign(_ahData, GRAPH_ALIGN_LEFT);
            GRAPH_DATA_YT_MirrorX (_ahData, 0);
          }
        }
        break;
      }
      break;
    }
    break;
  default:
    WM_DefaultProc(pMsg);
  }
}
回复

使用道具 举报

1

主题

5

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2016-11-15 21:06:58 | 显示全部楼层
1fwf.png
回复

使用道具 举报

1

主题

5

回帖

16

积分

新手上路

积分
16
 楼主| 发表于 2016-11-15 21:08:22 | 显示全部楼层
加上上面这些语句就会有内存损耗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2016-11-16 01:17:13 | 显示全部楼层

回 滨院小韩 的帖子

滨院小韩:加上上面这些语句就会有内存损耗 (2016-11-15 21:08) 
使用Graph控件时,必须要单独删除,这个控件比较特殊。
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
发表于 2018-3-28 13:57:01 | 显示全部楼层
校友啊,我也碰到这问题了。。
回复

使用道具 举报

16

主题

31

回帖

79

积分

初级会员

积分
79
发表于 2019-9-10 14:14:05 | 显示全部楼层
eric2013 发表于 2016-11-16 01:17
使用Graph控件时,必须要单独删除,这个控件比较特殊。

直接GUI_EndDialog(pMsg->hWin, 0);这样外,还需要单端删除Graph控件?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115778
QQ
发表于 2019-9-10 15:27:38 | 显示全部楼层
lyw851230 发表于 2019-9-10 14:14
直接GUI_EndDialog(pMsg->hWin, 0);这样外,还需要单端删除Graph控件?

对,务必要单独再删除一次
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-18 04:53 , Processed in 0.309001 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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