硬汉嵌入式论坛

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

[μCGUI] 救助 多窗体切换之后弹出错误对话框

[复制链接]

32

主题

97

回帖

193

积分

初级会员

积分
193
发表于 2015-7-18 15:41:06 | 显示全部楼层 |阅读模式
我使用多窗体界面切换,等切换多次后,会弹出,下面的对话框,Max. message nesting exceeded, Message skipped.  我在网上查过,这是因为回调函数的问题,请问这是什么原因触发这个问题,怎么解决呀???
1111.JPG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-18 15:58:39 | 显示全部楼层
估计是你多次创建造窗口造成的。切换到新的窗口上面,旧的窗口是怎么处理的。
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-18 16:48:41 | 显示全部楼层
这几个页面都是这么处理的,先GUI_EndDialog(hWin, 1);           //删除了这个对话框
然后再显示对话框
111.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-18 23:00:37 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:这几个页面都是这么处理的,先GUI_EndDialog(hWin, 1);           //删除了这个对话框
然后再显示对话框 (2015-07-18 16:48) 
知道怎么回事了,是因为你多次嵌套函数造成了死循环,你这里贴的函数里面调用了
MainTask();
不需要循环初始化这个函数,这个是程序的入口函数,就像使用MDK里面的main函数。
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-20 12:46:01 | 显示全部楼层
还是不行呀,还是出现以前的问题,麻烦你再帮我看看

MainTask文件:
void MainTask(void)
{
    GUI_Init();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window *///GUI_BLACK
    GUI_Clear();   
    MainInterfaceMainTask();
    while(1)
    {
    }
  
}
//----------------------------------------------------------------------------------------------------------------------------------------------
MainInterfaceMainTask文件
void MainInterfaceMainTask(void)
{
    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
    GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
}


        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);                                                                    //GUI_EndDialog删除了这个对话框
                    break;
                case GUI_KEY_ENTER:
                {
                    if (((WM_KEY_INFO*)(pMsg->Data.p))-&gtressedCnt == 0 )   //如果按键已经被释放
                    {
                        GUI_EndDialog(hWin, 0);
                        switch( temp )
                        {
                            case 0:            //巡检
                            {
                                  PollingMainTask();
                            }
                            break;
                              
                            case 1:            //自动编码
                            {
                                EncodedMainTask();   
                            }
                            break;
                              
                            case 2:            //自动登陆
                            {
                                  LandMainTask();
                            }

//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PollingMainTask文件
void PollingMainTask(void)
{
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window */
    WM_SetCreateFlags(WM_CF_MEMDEV);  /* Use memory devices on all windows to avoid flicker */
    GUI_ExecDialogBox(_aDialogCreate, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
}


    case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                {
                    if (((WM_KEY_INFO*)(pMsg->Data.p))-&gtressedCnt == 0 )   //如果按键已经被释放
                    {
                        GUI_EndDialog(hWin, 1);
                        MainInterfaceMainTask();                 //返回主界面
                    }
                    break;
                }
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-20 12:47:14 | 显示全部楼层
这是三个文件,已经不再循环调用MainTask了,可还出现那个问题
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 10:44:19 | 显示全部楼层
在吗?帮帮忙
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 10:53:16 | 显示全部楼层
在吗?帮帮忙
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-21 11:02:11 | 显示全部楼层
在回调函数里面是不允许调用阻塞对话框的 GUI_ExecDialogBox,你得调用非阻塞的。
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 11:13:38 | 显示全部楼层
调用非阻塞??那重绘怎么办,我自己重绘?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-21 11:26:59 | 显示全部楼层
oid MainTask(void)
{
    GUI_Init();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window *///GUI_BLACK
    GUI_Clear();   
    MainInterfaceMainTask();
    while(1)
    {
-------------------------------------------------->加入GUI_Delay(xxx)延迟函数即可
    }

}
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 12:58:28 | 显示全部楼层
还是不行呀,还是出现以前的问题,麻烦你再帮我看看

MainTask文件:
void MainTask(void)
{
    GUI_Init();
    WM_SetDesktopColor(GUI_WHITE);      /* Automacally update desktop window *///GUI_BLACK
    GUI_Clear();   
    MainInterfaceMainTask();
  
}
//----------------------------------------------------------------------------------------------------------------------------------------------
MainInterfaceMainTask文件
void MainInterfaceMainTask(void)
{
//   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, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    while (1)
    {
        GUI_Delay(10);
    }
}
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PollingMainTask文件
void PollingMainTask(void)
{
    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, GUI_COUNTOF(_aDialogCreate), &_cbCallback, 0, 0, 0);
    while (1)
    {
        GUI_Delay(10);
    }
}


我还是出现以前的问题。我用VC6.0下编译运行的,这个GUI_Delay函数,需要专门设置一下吗?
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 13:12:23 | 显示全部楼层
还有一个问题,当我多切换几次对话框后,又提示这个对话框,请问这是什么问题,如果解决???[s:128]
1111.JPG
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-21 14:09:41 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:还有一个问题,当我多切换几次对话框后,又提示这个对话框,请问这是什么问题,如果解决???[s:128]
 (2015-07-21 13:12) 
建议你使用emWin的模拟器试试,这个ucgui的还是早起的模拟器。
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 14:45:32 | 显示全部楼层
这个问题解决了
1111.JPG
回复

使用道具 举报

32

主题

97

回帖

193

积分

初级会员

积分
193
 楼主| 发表于 2015-7-21 15:17:22 | 显示全部楼层
我现在使用ucgui 3.98版本的,使用12864液晶屏,用stm32f103  只有64K flash,只想请程序小一点,这都要快放不下了,也没写几句,emwin模拟器,使用STemWin,调试好,放到stm里是不是变的比较大了?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2015-7-22 16:48:01 | 显示全部楼层

回 beyondabcd 的帖子

beyondabcd:我现在使用ucgui 3.98版本的,使用12864液晶屏,用stm32f103  只有64K flash,只想请程序小一点,这都要快放不下了,也没写几句,emwin模拟器,使用STemWin,调试好,放到stm里是不是变的比较大了? (2015-07-21 15:17)
一样的,跟ucgui差不多,只是现在的版本比较高了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 22:41 , Processed in 0.212133 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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