Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
新RTGUI, 求解惑
发布于 2012-09-05 15:15:34 浏览:2990
订阅该版
看了RealTouch发布的例程代码,有几点疑问: 基本上每个GUI线程都会创建一个application, ```application = rtgui_app_create(rt_thread_self(), "app_name");``` 然后一般会创建主窗口, ```win = rtgui_mainwin_create(RT_NULL, "AppMgr", RTGUI_WIN_STYLE_MAINWIN);``` 然后添加控件, 设置event_handler之类的。 问题1:有的线程会调用rtgui_app_run(application), 有的会调用rtgui_win_show(win, RT_FALSE), 还有的两者都调用。请问这里有没有什么区别或要求呢? 问题2:函数rtgui_app_set_as_wm()是只针对当前的GUI线程还是整个GUI的呢? 问题3:函数rtgui_app_set_main_win(win)的作用? 问题4:什么时候需要显式的调用函数rtgui_ack()? PS:自己写了几个测试例程, 总是不能很好的工作, 没什么头绪,也不知从何问起。
查看更多
5
个回答
默认排序
按发布时间排序
grissiom
2012-09-05
这家伙很懒,什么也没写!
1,只有在调用 rtgui_app_run 或者 rtgui_win_show(win, RT_TRUE) 之后 GUI 线程的事件循环才会启动。这时 GUI 才算是开始工作。 2,是整个 GUI 系统的。一般来说应该不用管。 3,这个是把 win 设置为主窗口,也就是激活 app 的时候会自动激活的窗口。 4,这个是处理同步事件时才用的。一般来说不会用到……
softwind
2012-09-06
这家伙很懒,什么也没写!
>1,只有在调用 rtgui_app_run 或者 rtgui_win_show(win, RT_TRUE) 之后 GUI 线程的事件循环才会启动。这时 GUI 才算是开始工作。 --- 那么如果调用rtgui_win_show(win, RT_TRUE)后,什么情况下必须再调用rtgui_app_run()?我看有的例程调用rtgui_app_run(),有的不调用? >4,这个是处理同步事件时才用的。一般来说不会用到…… --- RealTouch发布的历程中, ``` rt_bool_t event_handler(struct rtgui_object* object, rtgui_event_t* event) { rt_bool_t result; RT_ASSERT(object != RT_NULL); RT_ASSERT(event != RT_NULL); result = RT_TRUE; switch (event->type) { case RTGUI_EVENT_APP_CREATE: case RTGUI_EVENT_APP_DESTROY: return apps_list_event_handler(object, event); default: /* invoke parent event handler */ result = rtgui_app_event_handler(object, event); break; } return result; } ``` ``` rt_bool_t apps_list_event_handler(struct rtgui_object* object, struct rtgui_event* event) { RT_ASSERT(object != RT_NULL); RT_ASSERT(event != RT_NULL); switch (event->type) { case RTGUI_EVENT_APP_CREATE: _handle_app_create((struct rtgui_event_application*) event); break; case RTGUI_EVENT_APP_DESTROY: _handle_app_destroy((struct rtgui_event_application*) event); break; } return RT_TRUE; } ``` ``` static void _handle_app_create(struct rtgui_event_application* event) { rt_uint32_t index; rt_int32_t status; struct rtgui_app* app; status = RTGUI_STATUS_OK; for (index = 0; index < app_count; index ++) { app = (struct rtgui_app*)app_items[index].app; if (app == event->app) { /* application is created already */ status = RTGUI_STATUS_ERROR; goto __exit; } } app_count += 1; if (app_items == RT_NULL) app_items = (struct rtgui_application_item*) rtgui_malloc(sizeof(struct rtgui_application_item)); else app_items = (struct rtgui_application_item*) rtgui_realloc(app_items, sizeof(struct rtgui_application_item) * app_count); if (app_items == RT_NULL) { status = RTGUI_STATUS_ERROR; goto __exit; } app = event->app; app_items[app_count - 1].app = app; rtgui_listctrl_set_items(app_list, (rt_uint32_t)app_items, app_count); __exit: /* send ack to the application */ rtgui_ack(RTGUI_EVENT(event), status); return; } ``` 显式的调用了rtgui_ack(RTGUI_EVENT(event), status), 不太明白这其中消息处理的过程。还望不吝赐教。
bernard
2012-09-06
这家伙很懒,什么也没写!
这个地方是整个系统的App管理器,所以对App的事件进行专门的处理。如果是简单的,不需要应用管理器的界面,可以不需要这个。 rtgui_ack是回应一些同步消息的,因为请求任务在等着回应,不回应任务就挂在那里了。
softwind
2012-09-06
这家伙很懒,什么也没写!
感谢版主指点。 结合例程又看了一下源代码,大致的过程如下: 1) 针对一般的情况,在GUI线程的开始调用rtgui_app_create(),rtgui_app_create()函数中有如下的代码 ``` RTGUI_EVENT_APP_CREATE_INIT(&event); event.app = app; /* notify rtgui server to one application has been created */ if (rtgui_send_sync(srv_tid, RTGUI_EVENT(&event), sizeof(event)) == RT_EOK) { return app; } ``` 函数rtgui_send_sync()中 ``` ... event->ack = &ack_mb; r = rt_mq_send(app->mq, event, event_size); if (r != RT_EOK) { rt_kprintf("send sync event failed "); goto __return; } r = rt_mb_recv(&ack_mb, (rt_uint32_t*)&ack_status, RT_WAITING_FOREVER) ... ``` 会一直等待ack_mb。 server的事件处理函数 ``` static rt_bool_t rtgui_server_event_handler(struct rtgui_object *object, struct rtgui_event *event) { RT_ASSERT(object != RT_NULL); RT_ASSERT(event != RT_NULL); /* dispatch event */ switch (event->type) { case RTGUI_EVENT_APP_CREATE: case RTGUI_EVENT_APP_DESTROY: if (rtgui_wm_application != RT_NULL) { /* forward event to wm application */ rtgui_send(rtgui_wm_application->tid, event, sizeof(struct rtgui_event_application)); } else { /* always ack with OK */ rtgui_ack(event, RTGUI_STATUS_OK); } break; ``` 会处理RTGUI_EVENT_APP_CREATE。 RealTouch发布的例程中 ``` void app_mgr_entry(void* parameter) { struct rtgui_app* application; application = rtgui_app_create(rt_thread_self(), "AppMgr"); if (application != RT_NULL) { /* set as window manager */ rtgui_app_set_as_wm(); ... ``` 创建app_mgr线程的application时由sever线程的事件处理函数调用rtgui_ack(event, RTGUI_STATUS_OK),这样AppMgr线程继续执行,同时设定自己为wm; 对于加载的应用模块,以Button为例: ``` void main(void) { struct rtgui_app* application; struct rtgui_win* win; struct rtgui_button* button; application = rtgui_app_create(rt_thread_self(), "button"); ... ``` 由于已经设置了wm,此处的rtgui_app_create()需要rtgui_wm_application对应的线程也就是app_mgr线程来回复,因此需要在app_mgr线程的application的事件处理函数中调用rtgui_ack()完成应用模块GUI线程application的创建。 这么理解没什么问题吧? 还有几点: 1. rtgui_wm_application有什么特别的作用吗?好像只在rtgui_app_create(),rtgui_app_destroy()和rtgui_app_set_as_wm()几处用到。 2. 看代码,函数rtgui_app_run(application)会启动GUI线程的事件处理循环; 而有的例程只调用函数rtgui_win_show(),而rtgui_win_show()只在模式窗口时调用函数rtgui_app_run(application)。那rtgui_app_run()和rtgui_win_show()使用时有什么需要注意的吗?如果显示为模式窗口,则不需要调用rtgui_app_run();否则必须调用rtgui_app_run()?
撰写答案
登录
注册新账号
关注者
0
被浏览
3k
关于作者
softwind
这家伙很懒,什么也没写!
提问
41
回答
153
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
rt-thread 小内存算法源码分析
2
env中添加lvgl软件包后,keil编译包--c99错误
3
【NXP-MCXA153】 定时器驱动移植
4
GD32F450 看门狗驱动适配
5
【NXP-MCXA153】看门狗驱动移植
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
踩姑娘的小蘑菇
7
个答案
2
次被采纳
a1012112796
18
个答案
1
次被采纳
红枫
8
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
张世争
4
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部