硬汉嵌入式论坛

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

[emWin] 切换界面UCGUI动态内存不释放的问题?

[复制链接]

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
发表于 2016-9-1 12:08:46 | 显示全部楼层 |阅读模式
我现在是采用对话形式显示界面,创建如下:

GUI_Init();
  WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
  WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  HwinUser=GUI_CreateDialogBox(_aDialogCreate_main, GUI_COUNTOF(_aDialogCreate_main), &_cbCallback_main, 0, 0, 0);
关闭如下:

                case GUI_ID_BUTTON1:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        {
                          GUI_EndDialog(hWin, 0);
                          Disp_setup();               
                        }
                    break;
发现从A 界面切换B界面再回到A界面时,调用函数GUI_ALLOC_GetNumFreeBytes()显示时,值明显减小,说明内存没有释放。请问怎么回事?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115737
QQ
发表于 2016-9-2 09:23:03 | 显示全部楼层
多测试几次看看,是不是数值越来越小,另外你的这个函数里面是什么
        Disp_setup();
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-9-2 10:19:16 | 显示全部楼层

回 eric2013 的帖子

eric2013:
多测试几次看看,是不是数值越来越小,另外你的这个函数里面是什么
        Disp_setup();         
是越来越小,DISP_SETUP()是显示别外一个界面,自己做的一个函数。问题点现在找到了是因为这条语句:
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"Must Retry Failures");
就是不设置复选框文本退出时不释放内存,不知道是什么?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115737
QQ
发表于 2016-9-3 10:10:27 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:是越来越小,DISP_SETUP()是显示别外一个界面,自己做的一个函数。问题点现在找到了是因为这条语句:
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"Must Retry Failures");
就是不设置复选框文本退出时不释放内存,不知道是什么?
 (2016-09-02 10:19) 
按说不应该啊,这个CHECKBOX是以资源列表的形式加到对话框上面的吗,

如果方便的话,我看下你的A和B界面的函数,及其切换部分,仅看框架就行。
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-9-5 09:29:11 | 显示全部楼层

回 eric2013 的帖子

eric2013:按说不应该啊,这个CHECKBOX是以资源列表的形式加到对话框上面的吗,

如果方便的话,我看下你的A和B界面的函数,及其切换部分,仅看框架就行。 (2016-09-03 10:10)
A 界面回调函数中:
                case GUI_ID_BUTTON1:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        {
                          GUI_EndDialog(hWin, 0);
                          Disp_setup();  打开B界面,具体代码如下:              
                        }
                    break;

void Disp_setup(void)
{
    GUI_Init();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
    GUI_CreateDialogBox(_aDialogCreate_setup, GUI_COUNTOF(_aDialogCreate_setup), &_cbCallback_setup, 0, 0, 0);   
}
B界面回调函数中:

                case GUI_ID_CANCEL:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        {                                                
                        GUI_EndDialog(hWin, 0);
                           Disp_main();打开A界面,具体代码如下:
                      }
                    break;

void Disp_main(void)
{      
  GUI_Init();
  WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
  WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
  HwinUser=GUI_CreateDialogBox(_aDialogCreate_main, GUI_COUNTOF(_aDialogCreate_main), &_cbCallback_main, 0, 0, 0);
}
现在发现占内存的主要原因是在回调函数初始化中有这条语句:
CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"Must Retry Failures");
除掉切换界面就不占内存了,但除掉复选框就不显示字了。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115737
QQ
发表于 2016-9-5 09:58:55 | 显示全部楼层
这个错了。
GUI_Init();
WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */

这个三句话,仅需在进入emWin任务里面后调用以次就可以了。
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-9-5 10:51:57 | 显示全部楼层

回 eric2013 的帖子

eric2013:这个错了。
GUI_Init();
WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */

....... (2016-09-05 09:58) 
我有的是UCGUI,按照你的方法,也还是不行,我现在是只在带复选框的界面就会有退出时不释放内存的情况,其它界面没有。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115737
QQ
发表于 2016-9-6 08:45:00 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:我有的是UCGUI,按照你的方法,也还是不行,我现在是只在带复选框的界面就会有退出时不释放内存的情况,其它界面没有。 (2016-09-05 10:51) 
难道是uCGUI的问题,按说不应该啊,不行的话,就在  GUI_EndDialog(hWin, 0);前单独删除一次这个checkbox控件。

还有就是你的这个hWin是通过pMsg->hWin获得的吗
回复

使用道具 举报

35

主题

73

回帖

343

积分

高级会员

超越昨天

积分
343
QQ
 楼主| 发表于 2016-9-6 10:06:56 | 显示全部楼层

回 eric2013 的帖子

eric2013:难道是uCGUI的问题,按说不应该啊,不行的话,就在  GUI_EndDialog(hWin, 0);前单独删除一次这个checkbox控件。

还有就是你的这个hWin是通过pMsg->hWin获得的吗 (2016-09-06 08:45) 
试过了,单独删除一次check也不行,对是通过pMsg->hWin获得的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115737
QQ
发表于 2016-9-7 09:56:24 | 显示全部楼层

回 fanyanxi 的帖子

fanyanxi:试过了,单独删除一次check也不行,对是通过pMsg->hWin获得的 (2016-09-06 10:06) 
这个的确有些太奇怪了,难道是UCGUI的一个bug。
回复

使用道具 举报

0

主题

2

回帖

0

积分

新手上路

积分
0
发表于 2017-5-4 20:11:02 | 显示全部楼层
楼主好,我遇到了和你一样的问题,可一观察到内存减小,但是没有减到0,UI就死了,请问你解决了吗
回复

使用道具 举报

0

主题

2

回帖

0

积分

新手上路

积分
0
发表于 2017-5-4 20:14:54 | 显示全部楼层
static void PaintDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;

    /* 蓝条纹 */
    GUI_DrawBitmap(&bmpic_tiao, 0, 0);
    GUI_DrawBitmap(&bmpic_tiao, 0, 454);

    /* 机器显示 */
    GUI_DrawBitmap(&bmpic_machine, 0, 80);
}



/*****************************************************************
**      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_INIT_DIALOG
*****************************************************************/

static void InitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
    FRAMEWIN_SetClientColor(hWin,0xffffff);
    FRAMEWIN_SetTitleVis(hWin,0);
    //
    //GUI_ID_BUTTON0
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON0),BUTTON_CI_UNPRESSED,0xffffff);
    BUTTON_SetBitmap(WM_GetDialogItem(hWin,GUI_ID_BUTTON0), BUTTON_BI_UNPRESSED, &bmpic_bt_setup);

    //
    //GUI_ID_BUTTON2
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON2),BUTTON_CI_UNPRESSED,0xffffff);
    BUTTON_SetBitmap(WM_GetDialogItem(hWin,GUI_ID_BUTTON2), BUTTON_BI_UNPRESSED, &bmpic_bt_open);
}

回调中方法也是一样的:
case GUI_ID_BUTTON2:        /* 打开 */
                    if(NCode==WM_NOTIFICATION_RELEASED)
                    {
                        GUI_EndDialog(pMsg->hWin, 0);
                        MainTask_open();
                    }
                    break;

来回调用就死了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 07:18 , Processed in 0.295889 second(s), 30 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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