硬汉嵌入式论坛

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

[emWin] GUI_ExecDialogBox和GUI_MessageBox无返回

[复制链接]

3

主题

12

回帖

3

积分

新手上路

积分
3
发表于 2015-10-21 11:57:08 | 显示全部楼层 |阅读模式
我的程序只要执行GUI_ExecDialogBox和GUI_MessageBox就没有返回,好像死掉了一样。Stack_Size空间已经改大了(0x00001000),但也没有帮助。有没有谁遇到过同样的问题,谢谢。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-21 12:29:44 | 显示全部楼层
这两个都是阻塞式对话框,也就是说一点创建并执行后,只有关闭了,才可以让程序往下执行。
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-10-21 13:45:22 | 显示全部楼层
自带消息循环哦,模态窗口都是自带消息循环的,因此就是阻塞了
回复

使用道具 举报

3

主题

12

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2015-10-21 15:17:05 | 显示全部楼层
谢谢大家的回复

我的程序跑Button和窗口程序都没有问题,触摸屏也工作良好,但一进入GUI_MessageBox()后,Timer线程都没有反应了,所以跟本就没有办法读触摸屏,这个阻塞我要怎么才能出来呢?GUI_MessageBox内部又被STemWin526_CM4_OS_Keil.lib封装起来了。

int main(void)
{  
    osTimerId touch_timer;
   
    HAL_Init();
    SystemClock_Config();
    Uart_Init();
    Sample_IO_Init();

    osThreadDef(GUI_Thread, GUIThread, osPriorityHigh,0,15*configMINIMAL_STACK_SIZE);
    osThreadCreate (osThread(GUI_Thread), NULL);
    osTimerDef(Touch_Timer, TimerCallback);
    touch_timer =  osTimerCreate(osTimer(Touch_Timer), osTimerPeriodic, (void *)0);
    osTimerStart(touch_timer,100);
    osKernelStart();
    while (1)
    {
    }
}

static void GUIThread(void const * argument)
{
    Board_HW_Config();
    WM_SetCreateFlags(WM_CF_MEMDEV);
    GUI_Init();

    if (GUI_ALLOC_GetNumFreeBytes() < RECOMMENDED_MEMORY)
    {
        GUI_ErrorOut("Not enough memory available.");
        return;
    }
    GUI_Initialized = 1;
    GUI_Clear();
    GUI_SetColor(GUI_YELLOW);
    GUI_FillRect(0,0,320,240);
    GUI_Clear();
    osDelay(1000);
    printf("\\n================================================\\n");
    GUI_MessageBox("Test TEXT","Title",GUI_MESSAGEBOX_CF_MOVEABLE);
    //MESSAGEBOX_Create("Test TEXT","Title",GUI_MESSAGEBOX_CF_MODAL);
    printf("\\n================================================\\n");
    for(;;)
    {
        GUI_Exec();
        osDelay(200);
    }
}

static void TimerCallback(void const *n)
{  
    if(GUI_Initialized)
        Touch_Panel_Update();
}
回复

使用道具 举报

3

主题

12

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2015-10-21 15:40:50 | 显示全部楼层

回 eric2013 的帖子

eric2013:这两个都是阻塞式对话框,也就是说一点创建并执行后,只有关闭了,才可以让程序往下执行。 (2015-10-21 12:29) 
但是我的程序进去以后,就没有任何反应了,我怎么才能关闭呢?你有没有GUI_MessageBox内部的代码?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-21 18:19:24 | 显示全部楼层
你的这个创建是不是Timer的优先级低于GUI任务,如果是的话,那就将Timer的优先级设置的高于GUI任务试试看
怀疑GUI_MessageBox执行后,这个GUI任务没有释放CPU的使用权,低优先级的Timer一直没有得到执行。
回复

使用道具 举报

3

主题

12

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2015-10-22 09:54:48 | 显示全部楼层

回 eric2013 的帖子

eric2013:你的这个创建是不是Timer的优先级低于GUI任务,如果是的话,那就将Timer的优先级设置的高于GUI任务试试看
怀疑GUI_MessageBox执行后,这个GUI任务没有释放CPU的使用权,低优先级的Timer一直没有得到执行。 (2015-10-21 18:19) 
非常感谢eric2013,我把Timer线程权限置高后,问题就解决了。因为Timer的权限在另外一个文件里单独设置,所以一直没想到权限的问题。[s:151][s:151]
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-10-22 11:59:37 | 显示全部楼层
调试带os的程序,确实得有相关支持比较方便啊,比如能够看到任务切换就会好很多
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-23 00:38:38 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:调试带os的程序,确实得有相关支持比较方便啊,比如能够看到任务切换就会好很多 (2015-10-22 11:59) 
的确是啊,我这两天才知道MDK调试的时候可以设置定时更新功能,看RTX任务状态的更新的确方便了很多。
回复

使用道具 举报

5

主题

582

回帖

597

积分

版主

Rank: 7Rank: 7Rank: 7

积分
597
发表于 2015-10-23 07:25:59 | 显示全部楼层

回 eric2013 的帖子

eric2013:的确是啊,我这两天才知道MDK调试的时候可以设置定时更新功能,看RTX任务状态的更新的确方便了很多。 (2015-10-23 00:38) 
定时更新这个我还真不知道,具体如何
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115694
QQ
发表于 2015-10-23 09:07:51 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:

定时更新这个我还真不知道,具体如何
进入调试状态,然后点击RUN全速运行,然后再选中这个就可以了,你可以试试看,效果还不错:
1.png
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-13 01:00 , Processed in 0.413411 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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