硬汉嵌入式论坛

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

[emWin] WM_DeleteWindow 与 GUI_EndDialog 两者的区别?

[复制链接]

34

主题

111

回帖

213

积分

高级会员

程序小白

积分
213
QQ
发表于 2021-1-30 17:12:57 | 显示全部楼层 |阅读模式
如题,不是很清楚
回复

使用道具 举报

11

主题

122

回帖

160

积分

初级会员

积分
160
发表于 2021-1-30 20:43:25 | 显示全部楼层
GUI_EndDialog不执行实际的删除操作,只是标记当前页面需要删除,在下一次WM_Exec时会检查标记,有删除标记WM_SF_DELETE则执行WM_DeleteWindow,相当于延迟删除的功能。WM_DeleteWindow则是立即删除。通常而言GUI_EndDialog更安全,可避免一些异步的回调错误访问到已删除的widget
回复

使用道具 举报

3

主题

335

回帖

344

积分

高级会员

积分
344
发表于 2021-1-31 12:54:19 | 显示全部楼层
楼上所说完全正确,有源代码为证【pdf文档也有说明】:

  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.   //
  13.   // WM__DeleteSecure makes sure that the window will be deleted within
  14.   // the next execution of WM_Exec instead of deleting it immediately.
  15.   // Deleting immediately makes problems because further messages are
  16.   // send to the window under certain circumstances.
  17.   //
  18.   WM__DeleteSecure(hDialog);
  19. }
复制代码
  1. /*********************************************************************
  2. *
  3. *       WM__DeleteSecure
  4. */
  5. void WM__DeleteSecure(WM_HWIN hWin) {
  6.   WM_Obj * pWin;

  7.   pWin = WM_H2P(hWin);
  8.   pWin->Status |= WM_SF_DELETE;
  9.   _DeleteWindows = 1;
  10. }

  11. /*********************************************************************
  12. *
  13. *       _DeleteDelayed
  14. */
  15. static void _DeleteDelayed(void) {
  16.   WM_HWIN  hWin, hWinDelete;
  17.   WM_Obj * pWin;

  18.   WM_LOCK();
  19.   for (hWin = WM__FirstWin; hWin;) {
  20.     pWin = WM_H2P(hWin);
  21.     if (pWin->Status & WM_SF_DELETE) {
  22.       hWinDelete = hWin;
  23.       hWin = pWin->hNextLin;
  24.       WM_DeleteWindow(hWinDelete);
  25.     } else {
  26.       hWin = pWin->hNextLin;
  27.     }
  28.   }
  29.   _DeleteWindows = 0;
  30.   WM_UNLOCK();
  31. }

  32. /*********************************************************************
  33. *
  34. *       WM_Exec1
  35. */
  36. int WM_Exec1(void) {
  37.   /* Delete windows if required */
  38.   if (_DeleteWindows) {
  39.     _DeleteDelayed();
  40.   }
  41.   /* Poll PID if necessary */
  42.   if (WM_pfPollPID) {
  43.     WM_pfPollPID();
  44.   }
  45.   if (WM_pfHandlePID) {
  46.     if (WM_pfHandlePID())
  47.       return 1;               /* We have done something ... */
  48.   }
  49.   if (WM_IsActive) {
  50.     if (GUI_PollKeyMsg()) {
  51.       return 1;               /* We have done something ... */
  52.     }
  53.   }
  54. #ifdef WIN32
  55.   if (WM_PollSimMsg()) {
  56.     return 1;               /* We have done something ... */
  57.   }
  58. #endif
  59.   if (WM_IsActive && WM__NumInvalidWindows) {
  60.     WM_LOCK();
  61.     _DrawNext();
  62.     WM_UNLOCK();
  63.     return 1;               /* We have done something ... */
  64.   }
  65.   return 0;                  /* There was nothing to do ... */
  66. }
复制代码

回复

使用道具 举报

34

主题

111

回帖

213

积分

高级会员

程序小白

积分
213
QQ
 楼主| 发表于 2021-2-1 08:33:53 | 显示全部楼层
有梦为马 发表于 2021-1-30 20:43
GUI_EndDialog不执行实际的删除操作,只是标记当前页面需要删除,在下一次WM_Exec时会检查标记,有删除标记 ...

谢谢 明白了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 17:10 , Processed in 0.174246 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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