硬汉嵌入式论坛

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

[emWin] 窗口切换次数多了之后会变卡,还有那个graph小工具是不是需要单独删除?

[复制链接]

5

主题

26

回帖

89

积分

初级会员

积分
89
发表于 2018-3-28 15:23:50 | 显示全部楼层 |阅读模式
本帖最后由 Zoe. 于 2018-3-28 15:42 编辑

我的程序是在咱ATM机的程序上修改的。用了三个界面。
其中:第1个窗口中(也就第1个界面上)上我放了3个小的对话框,用来显示接收到的数据。
          第2个窗口中(也就第2个界面上),我放了一个对话框,里面有graph曲线工具,用来显示获得数据的曲线。
          第3个窗口中   就是ATM是输入的键盘界面,按取消的话返回第一个界面;
就这样三个界面在不断切换的时候,次数一多就卡了。请问这是为什么啊?
(我看到论坛里有说需要把graph工具单独删除,是这个原因吗?数据手册里我没找到删除graph的函数啊。)
下面是三个界面的样子




这是我第一界面创建的三个小对话框

这是我第一界面创建的三个小对话框

触摸按钮之后,删除这三个对话框,再删除窗口,在创建第二个窗口

触摸按钮之后,删除这三个对话框,再删除窗口,在创建第二个窗口


这是在第二窗口创建的对话框,里面有graph曲线工具。

这是在第二窗口创建的对话框,里面有graph曲线工具。

这是触摸按钮之后删除这个曲线所在的的对话框,在删除窗口,创建第三个窗口。第三个窗口我就不上图了。

这是触摸按钮之后删除这个曲线所在的的对话框,在删除窗口,创建第三个窗口。第三个窗口我就不上图了。





第一界面

第一界面

第2界面

第2界面

第三界面

第三界面
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-28 15:43:35 | 显示全部楼层
不要沉呐
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-28 16:28:49 | 显示全部楼层
有没有大神在啊?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115759
QQ
发表于 2018-3-28 16:31:56 | 显示全部楼层
Graph控件一定要单独删除,使用函数WM_DeleteWindow()
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-28 17:58:10 | 显示全部楼层
eric2013 发表于 2018-3-28 16:31
Graph控件一定要单独删除,使用函数WM_DeleteWindow()

                        if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
                        {
                                int Id = WM_GetId(pMsg->hWinSrc);
                                switch (Id)
                                {
                                        case GUI_ID_BUTTON1: //如果按下了,则删除当前对话框和窗口
//                                                _Language = 0;
                                             hItem1 = WM_GetDialogItem(hdlg3, GUI_ID_GRAPH0);//graph小工具的的句柄
                                             WM_DeleteWindow(hItem1);   //删除graph小工具
                                             GUI_EndDialog(hdlg3,1);                                       
                                              WM_DeleteTimer(        hTimer2);
                                                                i_num=0;  //如果退出了这个窗口 就清0
                                              inter_flag=0;
                                                                _DeleteFrame();
                                                                _CreateFrame(&_cbEnterAmount);
                                              GUI_Delay(100);
                                                break;


为啥还是内存不断减少呢,切换一段时间还是会变慢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115759
QQ
发表于 2018-3-29 00:27:57 | 显示全部楼层
Zoe. 发表于 2018-3-28 17:58
if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
                        {
                                int Id = WM_GetId(pMsg->hWinSrc);

你这的代码有误,单独删除一次Graph控件就可以了。
然后调用GUI_EndDialog(hdlg3,1)函数会把对话框上面的所有控件都删除调用,含你创建的定时器。

然后这个回调函数里面不可以调用GUI_Delay,会造成函数不断嵌套。
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-29 09:39:00 | 显示全部楼层
本帖最后由 Zoe. 于 2018-3-29 09:43 编辑
eric2013 发表于 2018-3-29 00:27
你这的代码有误,单独删除一次Graph控件就可以了。
然后调用GUI_EndDialog(hdlg3,1)函数会把对话框上面 ...

我现在不调用我有graph的界面了,用第一个界面的button直接调用ATM的第11个界面,这两个界面不断切换,然后内存还是不断减少啊。这是为啥啊,你看看这第一个界面的回调函数写的:

/*
*********************************************************************************************************
*        函 数 名: _cbLanguage
*        功能说明: 第一个界面,用于中文和英语的选择
*        形    参:pMsg  参数指针
*        返 回 值: 无
回调例程被调用的时候会收到以其pMsg参数指定的消息
*********************************************************************************************************
*/
static void _cbLanguage(WM_MESSAGE* pMsg)
{

        WM_HWIN hWin = pMsg->hWin;
        switch (pMsg->MsgId)
        {
                case WM_CREATE:
                        /* 设置聚焦 */
                        WM_SetFocus(hWin);
        /*创建四个按钮*/        
        _CreateButton(hWin, "风机", GUI_ID_BUTTON0, 10, 340, 100, 50, 0);        
                    _CreateButton(hWin, "水泵", GUI_ID_BUTTON1, 130, 340, 100, 50, 0);        
                    _CreateButton(hWin, "锅炉", GUI_ID_BUTTON2, 250, 340, 100, 50, 0);        
                    _CreateButton(hWin, "照明", GUI_ID_BUTTON3, 370, 340, 100, 50, 0);        
                                 hdlg0=CreateFramewin0();  //在窗口上新建的对话框0
                                 hdlg1=CreateFramewin1();  //在窗口上新建的对话框1
                                 hdlg2=CreateFramewin2();  //在窗口上新建的对话框2

              break;
                 case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                                case GUI_KEY_RIGHT:
                                        WM_SetFocusOnNextChild(hWin);
                                        break;
           case GUI_KEY_LEFT:
               WM_SetFocusOnPrevChild(hWin);
               break;
            }
            break;
                case WM_PAINT:                        
                           _PaintFrame(); //背景窗口

                //在窗口顶部显示
                        _hTitle = TEXT_CreateEx(0, 0, LCD_GetXSize(), 32, WM_HBKWIN, WM_CF_SHOW, 0, GUI_ID_TEXT0, _GetLang(19));
                                TEXT_SetTextAlign(_hTitle, GUI_TA_HCENTER);
                                TEXT_SetFont(_hTitle, MAIN_FONT);
        
                        break;
                case WM_NOTIFY_PARENT:  //告知父窗口
                        if (pMsg->Data.v == WM_NOTIFICATION_RELEASED)
                        {
                                int Id = WM_GetId(pMsg->hWinSrc);
                                switch (Id)
                                {
                                        case GUI_ID_BUTTON0: //如果按下了button0 则关闭三个对话框,再删除窗口        
                                                
                                                                GUI_EndDialog(hdlg0,1); //删除对话框0
                                                                GUI_EndDialog(hdlg1,1);//删除对话框1
                                                                GUI_EndDialog(hdlg2,1);        //删除对话框2

                                                              _DeleteFrame();                                       
                                 mem_num=GUI_ALLOC_GetNumFreeBytes(); //获取剩余内存
                     printf("neicun2=%u\r\n",mem_num);  //打印此时内存数 neicun2
                                       
                                       _CreateFrame(&_cbThanks);  //第一个界面按下按钮后,直接创建第11个界面,然后第1个界面和第11个界面不断切换
                                       
                                        mem_num=GUI_ALLOC_GetNumFreeBytes();//获取剩余内存
                      printf("neicun3=%u\r\n",mem_num);//打印此时内存数 neicun3

                                            _Language = 0;
                                                break;
                                        case GUI_ID_BUTTON1: //否则是英文
                                                _Language = 1;
                                                break;
                                }


                        }
                        break;
                default:
                WM_DefaultProc(pMsg);
        }
}
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-29 09:46:22 | 显示全部楼层
本帖最后由 Zoe. 于 2018-3-29 09:55 编辑



回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-29 09:48:41 | 显示全部楼层
eric2013 发表于 2018-3-29 00:27
你这的代码有误,单独删除一次Graph控件就可以了。
然后调用GUI_EndDialog(hdlg3,1)函数会把对话框上面 ...

neicun2=87960
neicun3=87904
neicun2=86680
neicun3=86624
neicun2=85392
neicun3=85336
neicun2=84096
neicun3=84040
neicun2=82808
neicun3=82752
neicun2=81500
neicun3=81444
neicun2=80220
neicun3=80164
neicun2=78684
neicun3=78628
这是串口输出的结果
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
 楼主| 发表于 2018-3-29 12:43:27 | 显示全部楼层
eric2013 发表于 2018-3-29 00:27
你这的代码有误,单独删除一次Graph控件就可以了。
然后调用GUI_EndDialog(hdlg3,1)函数会把对话框上面 ...

请问你还在吗?这一句我没动它啊,就是用的源程序的啊,我是想用窗口上的按键来关闭窗口上存在的对话框,这样操作不对吗?弄了两天了 还没找出原因来
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115759
QQ
发表于 2018-3-30 03:01:24 | 显示全部楼层
Zoe. 发表于 2018-3-29 12:43
请问你还在吗?这一句我没动它啊,就是用的源程序的啊,我是想用窗口上的按键来关闭窗口上存在的对话框, ...

不好意思啊,没有及时回复你消息,最近事情比较多

现在解决没。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 08:26 , Processed in 0.305995 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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