硬汉嵌入式论坛

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

[emWin] 关于的GUI_EndDialog 和 WM_DeleteWindow 的一个区别

[复制链接]

10

主题

23

回帖

63

积分

初级会员

积分
63
发表于 2018-8-7 20:17:22 | 显示全部楼层 |阅读模式
1. 相关帖子:EMWIN的GUI_EndDialog 和 WM_DeleteWindow 这两个函数有什么区别
GUI_EndDialog和WM_DeleteWindow的区别: http://www.armbbs.cn/forum.php?mod=viewthread&tid=18964

2. 本次实验环境 vs2013 + stemwin 5.32 + emwin 5.36手册

3.实验结果: WM_DeleteWindow可以快速的响应 WM_DELETE, 而 GUI_EndDialog 需要等新的对话框init完之后才能响应.根据手册内容提示,在某些特殊情况下,可以直接使用 WM_DeleteWindow 替代 GUI_EndDialog.

4.实验步骤:
1) 打开对话框 A
2) 在A的基础,先将A关闭,然后打开对话框B. 在A对话框中的一个按钮的回调中执行先关闭A,再打开对话框B即可.
3) 在A的WM_DELETE消息中打断点 :
case WM_DELETE :
{
int iii = 0;
iii = iii;
}

在B的WM_INIT_DIALOG中打断点:

case WM_INIT_DIALOG :
{
int qqq = 0;
qqq = qqq;
}

4)得到实验结果.

5.手册相关内容:
snipaste_20180807_201921.png snipaste_20180807_201928.png


评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 谢谢楼主分享

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-7 21:04:18 | 显示全部楼层
UCGUI3.98源码这里有:http://www.armbbs.cn/forum.php?mod=viewthread&tid=2127

=========================
ps:你的第三方链接被我编辑掉了,特此跟你说下
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 12:09:33 | 显示全部楼层
楼主说的没错。新的emWin版本中,GUI_EndDialog函数已经发生变化;没必要拿3.98的代码来比较!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 12:13:39 | 显示全部楼层
公仆 发表于 2018-8-8 12:09
楼主说的没错。新的emWin版本中,GUI_EndDialog函数已经发生变化;没必要拿3.98的代码来比较!

不是拿3.98对比,你不了解情况,楼主之前的一段话被我编辑掉了,楼主要一下UCGUI的源码需要看。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 12:17:41 | 显示全部楼层
本人最近开发过程中就需要区别该特征的变化;原因是我在对话框init时,缓存一个memdev图片,在窗口delete事件中删除之。
为了节省内存,就要求A窗口delete事件必须发生在新建的B窗口init之前,这样能保证B窗口也有可用内存来缓存图片!
现象是,调用GUI_EndDialog不能立即delete窗口A;通过printf输出很容易看到现象!
附上新文档说明:
2018-08-08_121123.png

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 12:28:22 | 显示全部楼层
公仆 发表于 2018-8-8 12:17
本人最近开发过程中就需要区别该特征的变化;原因是我在对话框init时,缓存一个memdev图片,在窗口delete事 ...

你的这个情况,看3.98源码依然适用,为什么呢,且下面代码,函数 GUI_EndDialog调用了WM_DeleteWindow,

在这之前的函数GUI_GetDialogStatusPtr,这个函数有调用消息发送函数,消息的执行一定要有GUI_Delay,GUI_Exec之类的函数执行才能正在有效。

  1. /*********************************************************************
  2. *
  3. *       GUI_EndDialog
  4. */
  5. void GUI_EndDialog(WM_HWIN hDialog, int r) {
  6.   WM_DIALOG_STATUS* pStatus;
  7.   pStatus = GUI_GetDialogStatusPtr(hDialog);
  8.   if (pStatus) {
  9.     pStatus->ReturnValue = r;
  10.     pStatus->Done = 1;
  11.   }
  12.   WM_DeleteWindow(hDialog);
  13. }
复制代码

回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:17:10 | 显示全部楼层
eric2013 发表于 2018-8-8 12:28
你的这个情况,看3.98源码依然适用,为什么呢,且下面代码,函数 GUI_EndDialog调用了WM_DeleteWindow,
...

坛主你错了。emWin新版的GUI_EndDialog函数,不再直接调用WM_DeleteWindow(hDialog)了;请坛主保持谨慎的态度去验证一下即可。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:20:34 | 显示全部楼层
公仆 发表于 2018-8-8 13:17
坛主你错了。emWin新版的GUI_EndDialog函数,不再直接调用WM_DeleteWindow(hDialog)了;请坛主保持谨慎的 ...

调用没有调用没关系的,这个结论是不是依然适用。
调用函数WM_DeleteWindow(hDialog)仅仅是立即就发送了WM_DELECT消息。


回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:27:16 | 显示全部楼层
eric2013 发表于 2018-8-8 13:20
调用没有调用没关系的,这个结论是不是依然适用

GUI_EndDialog不调用WM_DeleteWindow(hDialog),也就不会在函数里产生wm_delete消息了。
其实验证方法很简单:你在调用GUI_EndDialog函数的前后都打印出信息(例如"before","after"),也在wm_delete事件处理的case处也打印出信息(例如"delete"),看看“delete”是不是夹在"before"和"after"之间即可。
而根据3.98的源码分析应该夹在中间的;emWin新版不再夹在中间了。它在GUI_EndDialog函数里置标志,而延后到WM_Exec()里才调用WM_DeleteWindow(hDialog),理解了吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:29:27 | 显示全部楼层
公仆 发表于 2018-8-8 13:27
GUI_EndDialog不调用WM_DeleteWindow(hDialog),也就不会在函数里产生wm_delete消息了。
其实验证方法很 ...

你在搞笑么,GUI_EndDialog怎么会没有wm_delete消息,通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好,是不是都有消息wm_delete
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:32:23 | 显示全部楼层
eric2013 发表于 2018-8-8 13:29
你在搞笑么,GUI_EndDialog怎么会没有wm_delete消息

呵呵,请注意楼主说的现象的emWin版本号是5.32;而我使用的版本是5.46.由此可以看出至少从5.32版就是如此:GUI_EndDialog不会产生wm_delete消息!直到WM_Exec()被执行!
我一直就强调新版和旧版的区别,而你一直用旧版的眼光看新问题!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:33:34 | 显示全部楼层
公仆 发表于 2018-8-8 13:32
呵呵,请注意楼主说的现象的emWin版本号是5.32;而我使用的版本是5.46.由此可以看出至少从5.32版就是如此 ...

这个不影响啊,现象是不是GUI_EndDialog后也有wm_delete消息
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:33:51 | 显示全部楼层
eric2013 发表于 2018-8-8 13:29
你在搞笑么,GUI_EndDialog怎么会没有wm_delete消息,通过设置标志后期调用也好,还是直接调用WM_DelectW ...

我不喜欢搞笑的。坛主太过于自负,不能接收跟自己认知不一样的事情。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:35:41 | 显示全部楼层
公仆 发表于 2018-8-8 13:33
我不喜欢搞笑的。坛主太过于自负,不能接收跟自己认知不一样的事情。



我就是想说:现象是不是GUI_EndDialog后也有wm_delete消息,有的话,说明本质还是一样的,仅仅官方优化了下实现。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:43:08 | 显示全部楼层
eric2013 发表于 2018-8-8 13:35
我就是想说:现象是不是GUI_EndDialog后也有wm_delete消息,有的话,说明本质还是一样的,仅仅 ...

楼主的实验结果不就是为了说明 WM_DeleteWindow 和 GUI_EndDialog的区别吗?
而你到现在还以为GUI_EndDialog函数里夹着wm_delete消息的!
WM_DeleteWindow 函数里是夹着wm_delete的,这么明显的区别能一样吗?
这个区别导致在wm_delete里释放自创建资源的时机是不同的!
也就会导致内存申请和释放的时机交叉,导致内存不够用;
比如申请A,释放A,申请B,释放B;如此下去内存都够。
但是申请A,申请B,释放A,释放B;内存就未必不够用!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:47:53 | 显示全部楼层
公仆 发表于 2018-8-8 13:43
楼主的实验结果不就是为了说明 WM_DeleteWindow 和 GUI_EndDialog的区别吗?
而你到现在还以为GUI_EndDi ...

那我的理解没问题啊。正如我10楼所说的“通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好”

你程序里面调用了GUI_EndDialog是不是有wm_delete消息被执行。楼主的测试仅仅能证明之后被调用,证明不了没调用啊。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:51:12 | 显示全部楼层
eric2013 发表于 2018-8-8 13:47
那我的理解没问题啊。

你程序里面调用了GUI_EndDialog是不是有wm_delete消息被执行。楼主的测试仅仅能 ...

楼主不是要证明没调用;而是证明延后调用!他是对的。
WM_DeleteWindow函数是真正的释放资源,且同步发送wm_delete消息。而GUI_EndDialog仅仅是置标志而已,完全不相同!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 13:53:26 | 显示全部楼层
公仆 发表于 2018-8-8 13:51
楼主不是要证明没调用;而是证明延后调用!他是对的。
WM_DeleteWindow函数是真正的释放资源,且同步发 ...

这不就是我10楼主说的吗:通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好

你程序里面调用了GUI_EndDialog是不是有wm_delete消息被执行,我说的完全没问题啊。

这就印证了,看之前的UCGUI3.98源码是可以的,现在新版只是优化了下实现方法而已。
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:55:56 | 显示全部楼层
eric2013 发表于 2018-8-8 13:47
那我的理解没问题啊。正如我10楼所说的“通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好”
...

你去看看http://bbs.armfly.com/read.php?tid=18964帖子里你的回复:
“实际效果基本一样的,只是GUI_EndDialog多了个参数。别的区别暂时没有发现。”
这个结论,在3.98版本里正确;但是在楼主的5.32版里面就错了!
楼主这个帖子不就是为了提出这个区别吗?
你是不是还沉浸在3.98源码的认知里没跳出来?
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 13:59:39 | 显示全部楼层
eric2013 发表于 2018-8-8 13:53
这不就是我10楼主说的吗:通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好

你程序里面调 ...

我就问你,你这个说法是不是在我们几番交互之后才有的认知变化?
楼主说:“3.实验结果: WM_DeleteWindow可以快速的响应 WM_DELETE, 而 GUI_EndDialog 需要等新的对话框init完之后才能响应.根据手册内容提示,在某些特殊情况下,可以直接使用 WM_DeleteWindow 替代 GUI_EndDialog.”
你事先知道这个区别吗?这个结论跟3.98源码一致吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 14:05:05 | 显示全部楼层
公仆 发表于 2018-8-8 13:55
你去看看http://bbs.armfly.com/read.php?tid=18964帖子里你的回复:
“实际效果基本一样的,只是GUI_En ...

我有说楼主的观点有错误吗。3楼主就跟你说了,楼主需要看下这个代码,我仅仅贴一下源码的位置。

而你不认同看旧版对新版起作用,我后续跟你的讨论就是在跟你说明,对于我们这些手头只有库的用户,看老版依然是适用的,内核的东西仅仅换了一种实现方法。

像18楼说明的:
这不就是我10楼主说的吗:通过设置标志后期调用也好,还是直接调用WM_DelectWindow也好

你程序里面调用了GUI_EndDialog是不是有wm_delete消息被执行,我说的完全没问题啊。

这就印证了,看之前的UCGUI3.98源码是可以的,现在新版只是优化了下实现方法而已。

回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2018-8-8 14:23:55 | 显示全部楼层
eric2013 发表于 2018-8-8 14:05
我有说楼主的观点有错误吗。3楼主就跟你说了,楼主需要看下这个代码,我仅仅贴一下源码的位置。

而你 ...

鸭子的嘴扁了还是硬的
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106660
QQ
发表于 2018-8-8 14:27:41 | 显示全部楼层
公仆 发表于 2018-8-8 14:23
鸭子的嘴扁了还是硬的



谢谢讨论这么多,到此结束
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-8-8 17:10:01 | 显示全部楼层
我还以为帖子里面讨论了点啥好东西,这种逗逼问题有什么好讨论的,直接在按钮回调函数里面操作不就行吗,你想谁先,就谁先。

比如你想先删除之前创建的存储设备,就直接在按钮回调函数优先删除就好了。

Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2018-8-8 17:14:14 | 显示全部楼层
另外在对话框里面调用 WM_DeleteWindow 删除是不规范的做法,因为此函数比较暴力,直接的删除,而没有了GUI_EndDialog的状态判断。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2018-8-8 22:49:09 | 显示全部楼层
技术争论本没有错,错的是伤了和气。
回复

使用道具 举报

19

主题

31

回帖

88

积分

初级会员

积分
88
发表于 2018-8-9 16:26:49 | 显示全部楼层
mark, 学习了。
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-2-23 12:48:43 | 显示全部楼层
公仆 发表于 2018-8-8 13:27
GUI_EndDialog不调用WM_DeleteWindow(hDialog),也就不会在函数里产生wm_delete消息了。
其实验证方法很 ...

会不会是向父窗口发送一个请删除本窗口的信息,然后gui_delay时候扫描消息队列时再处理

如果真是这样,那这两个函数差别确实很大了
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2019-2-23 12:58:41 | 显示全部楼层
byccc 发表于 2018-8-8 17:14
另外在对话框里面调用 WM_DeleteWindow 删除是不规范的做法,因为此函数比较暴力,直接的删除,而没有了GUI ...

我也觉得,这都违背了消息回调处理的原则,不过正如公仆所言,既然这个函数存在,就是因为某些情况下必须如此
回复

使用道具 举报

3

主题

105

回帖

114

积分

初级会员

积分
114
发表于 2019-2-23 13:08:37 | 显示全部楼层
myxiaonia 发表于 2019-2-23 12:48
会不会是向父窗口发送一个请删除本窗口的信息,然后gui_delay时候扫描消息队列时再处理

如果真是这样 ...

确实如你所说的。
GUI_Delay调用GUI_Exec,再调用WM_Exec,再调用挂起的(仅由GUI_EndDialog挂起)窗口删除操作。看最新版emWin的pdf文档即可知
回复

使用道具 举报

1

主题

24

回帖

27

积分

新手上路

积分
27
发表于 2023-10-7 17:38:33 | 显示全部楼层
感谢两位火爆讨论,解决一个死机的问题,
在GUI_EndDialog  之后 ,加上一个GUI_Exec,解决一定概率下的司机问题。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 05:36 , Processed in 0.338024 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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