硬汉嵌入式论坛

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

[emWin] 关闭窗口后,内存无法释放

[复制链接]

1

主题

2

回帖

1

积分

新手上路

积分
1
发表于 2016-10-8 14:11:54 | 显示全部楼层 |阅读模式
使用STemWin时,我遇到一个问题:
在工程中,我需要用到很多窗口,系统资源是不允许我把所有窗口都预先创建并隐藏的。所以,我在主窗口中,点击按钮时创建另一个窗口,在另一个窗口中完成所需功能后关闭它。
这时候问题出现了,我重复创建、关闭的动作数次后,系统内存耗尽并死机了[s:139]

下面是我的部分代码,请大家帮忙看下,是哪里不对了呢?



/*********************************************************************
*
*       _cbDateTimeDialog(消息处理)
*/
//static
void _cbDateTimeDialog(WM_MESSAGE * pMsg) {
  WM_HWIN hItem;
  int     NCode;
  int     Id;
  // USER START (Optionally insert additional variables)
  
  switch (pMsg->MsgId) {
   
  case WM_INIT_DIALOG:
FormatString(m_ucDT, GUI_ALLOC_GetNumFreeBytes(), 0, 4, 0);
hItem = WM_GetDialogItem(pMsg->hWin, ID_DT_MEMORY);
TEXT_SetBkColor(hItem,0x00FF8000);

break;
  case WM_NOTIFY_PARENT:
    Id    = WM_GetId(pMsg->hWinSrc);
    NCode = pMsg->Data.v;
    switch(Id) {
    case ID_DT_BUTTON_CANCLE:
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        break;
      case WM_NOTIFICATION_RELEASED:
GUI_EndDialog(hWinDT,0);
        break;
      }
      break;
    }
    break;
  case WM_DELETE:
GUI_ALLOC_Free(pMsg->hWin);
break;
  default:
    WM_DefaultProc(pMsg);
    break;
  }
}
/*********************************************************************
*
*       创建窗口
*/
WM_HWIN CreateDTWindow(void) {
    hWinDT = GUI_CreateDialogBox(_DTDialogCreate, GUI_COUNTOF(_DTDialogCreate), _cbDateTimeDialog, WM_HBKWIN, 0, 0);
  WM_BringToTop(hWinDT);
  return hWinDT;
}
回复

使用道具 举报

1

主题

2

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2016-10-8 14:17:56 | 显示全部楼层
我特意设定了一个剩余内存显示。每次创建这个窗口,都会显示剩余内存。
结果,第一次创建时,GUI_ALLOC_GetNumFreeBytes() 返回的值是十几万。
按说,执行GUI_EndDialog时,应该就把窗口占用的内存释放了吧?可是,我关闭窗口后再次创建,GUI_ALLOC_GetNumFreeBytes() 的返回值就只有9万了,上次创建窗口时分配的内存被系统“吃”掉了。
回复

使用道具 举报

354

主题

2164

回帖

3231

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3231
发表于 2016-10-8 18:23:57 | 显示全部楼层

回 weihua_8206 的帖子

weihua_8206:我特意设定了一个剩余内存显示。每次创建这个窗口,都会显示剩余内存。
结果,第一次创建时,GUI_ALLOC_GetNumFreeBytes() 返回的值是十几万。
按说,执行GUI_EndDialog时,应该就把窗口占用的内存释放了吧?可是,我关闭窗口后再次创建,GUI_ALLOC_GetNumFreeBytes() 的返回值就 .. (2016-10-08 14:17) 
记得创建窗口前,先用Iswindow那个函数判断一下以前的句柄是否有效。

如果按键处理程序不好的话,可能点击一次button,却创建了2次窗口,所以内存会不断损耗。
回复

使用道具 举报

1

主题

2

回帖

1

积分

新手上路

积分
1
 楼主| 发表于 2016-10-9 15:33:38 | 显示全部楼层
经查,果然是每次按键都触发两次消息事件。
请问,如何避免这种情况呢?是不是使用GUIBuider创建的窗口,默认状态都有这种情况?
还有,GUI_EndDialog执行后,被关闭的窗口似乎并没有消失。我通过GUI_ExecCreatedDialog打开上级对话框之后,反复打开,关闭此对话框后,虽然可用内存不减少了,但还是会死机。

我的初衷是,在非阻塞式对话框A中,点击某按钮,会打开另一个非阻塞式对话框B,在B中,点击某按钮,对话框B会被关闭,回到对话框A(对话框均为全屏)。
可是现在,我关闭对话框B后,对话框B并不消失,界面仍显示对话框B。我需要执行GUI_ExecCreatedDialog(A)才能显示对话框A(这样做似乎也不对,因为这相当于把A变成阻塞式的了吧?)。而且,反复创建、关闭对话框B后,还是会死机。
请指教,如何才能使GUI_EndDialog(B)执行后,B对话框自动从界面上消失,A对话框重新出现呢?
回复

使用道具 举报

354

主题

2164

回帖

3231

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3231
发表于 2016-10-10 22:53:48 | 显示全部楼层

回 weihua_8206 的帖子

weihua_8206:经查,果然是每次按键都触发两次消息事件。
请问,如何避免这种情况呢?是不是使用GUIBuider创建的窗口,默认状态都有这种情况?
还有,GUI_EndDialog执行后,被关闭的窗口似乎并没有消失。我通过GUI_ExecCreatedDialog打开上级对话框之后,反复打开,关闭此对话框后,虽然可用内 .. (2016-10-09 15:33) 
执行enddialog后,不会马上消失对话框。
因为具体的消失工作,在GUI_Delay()中执行。所以你得等一个emwin周期。
回复

使用道具 举报

5

主题

26

回帖

89

积分

初级会员

积分
89
发表于 2018-3-28 16:05:10 | 显示全部楼层
请问楼主怎么解决的啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 12:27 , Processed in 0.258959 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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