




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
X5基础组UI菜单切换的方式的变更 基础组第一介绍之前版本的现状:open主菜单close系统设置节目搜索openopencloseclose从执行线路上看,菜单的打开采用同步的方式,即若从主菜单切换到系统设置菜单时,是在主菜单的callback内部直接执行系统设置的PRE_OPEN 和POST_OPEN初始化动作。并没有先执行主菜单的退出(执行PRE_CLOSE和POST_CLOSE)。解析上面切换的过程:1、从全屏到主菜单 全屏主菜单执行次数Open执行次数Close执行次数主菜单 10系统设置00节目搜索002、从主菜单切换到系统设置 主菜单系统设置执行次数Open执行次数Close执行次数主菜单 10系统设置10节目搜索003、从系统设置到节目搜索 系统设置节目搜索执行次数Open执行次数Close执行次数主菜单 10系统设置10节目搜索104、从节目搜索返回系统设置 节目搜索系统设置执行次数Open执行次数Close执行次数主菜单 10系统设置20节目搜索115、从系统设置返回主菜单 系统设置主菜单执行次数Open执行次数Close执行次数主菜单 20系统设置21节目搜索116、从主菜单返回全屏 主菜单全屏执行次数Open执行次数Close执行次数主菜单 21系统设置21节目搜索11从上表可以看出,菜单的切换过程中open与close执行次数以及执行时机并没有一一对应起来。目前一个菜单被设计成相对独立的功能实体。多个菜单因为占用资源的原因并不能同时接管与处理消息。根本原因是底层未能对多线程操作的安全性提供足够的支持或者是资源本身有限。Open动作可能对环境或资源的改变包括以下:设备层面:改变设备工作模式,设备数据(所有一切的寄存器)OS层面:创建线程,线程同步,内存分配。APP层面:改变APP自身所维护的全局变量等数据。Close过程与之相反。此类菜单切换方式潜在引出的问题:1、一个菜单的open过程中申请了资源,而在该资源还未释放时就去打开新的菜单,而在执行新的菜单的初始化工作时,又去申请资源,若两个菜单对资源使用没有太多的交叉或者联系,那么并不会有什么问题。最简单的例子是主菜单与系统设置这样简单到不能再简单的界面并不会申请太多的资源或者改变环境现状。但是随着应用越来越复杂,他们对使用的资源交叉见度更大,比如说两个界面都去申请内存,而内存只能满足任何一方的需要而不能同时满足两者。这样必须在切换到新的界面时释放内存然后再让后者申请。2、即使已经意识上面这个问题,但是如果申请了资源的人自己不去释放资源而让别人(并不知情的人)去释放,那是不现实的做法,目前的项目代码中存在很多这些盲目枚举他人对资源占用情况。这种不可取的做法听得最多的是:规避!一个原则:谁申请了资源或者谁改变了环境,必须由其自身去释放或者还原。做事要有手尾!第二、X5基础组UI新版本的设计Control线程原菜单窗口管理中 心新菜单osal_msgqueue_receive消息接收新菜单的打开采用异步方式。从执行流程上,如主菜单内部想要去打开新的菜单系统设置,那么主菜单先首先返回到control的窗口管理代码,然后再让窗口管理中心去打开新的菜单系统设置。在主菜单返回到control的这个过程中,可以选择两种返回方式,一种是“是”需要执行主菜单的退出动作,另一种“不“需要执行。这是菜单返回本身自己的意愿。目前打开一个新的菜单,根据所处环境不同,有三种方法:1、 非control线程希望打开一个新的菜单。 Control以外的线程要想打开一个菜单,只能采用发消息的方式,具体函数。ap_send_msg(CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT, (UINT32)menu, TRUE);2、 Control线程中非菜单内部,也即是control消息分发分支中除传给osd_objproc()以外的代码希望打开一个新的菜单。除可以以上面发消息的消息打开新的菜单外,只能使用原osd_objopen+menu_stack_push 3、 菜单内部希望打开新的菜单。菜单内部具体的指的是menu_message_proc中osd_objproc。只能使用win_open或win_enter_root函数打开新的菜单。win_open打开一个新菜单,win_enter_root清除所有已存在的菜单并打开新的菜单。如果在使用这两个函数后给对应的对象callback返回PROC_LEAVE,则表明告诉control中菜单管理中心应该执行CLOSE动作关闭当前的菜单(但保留其在菜单堆栈中),再去执行打开新的窗口。区别返回PROC_LEAVE的PROC_PASS 和PROC_LOOP,仅仅在不执行CLOSE动作。仍然保留其在堆栈中。函数原型及其实现:/* * win_open - 切换到新的窗口的同时保持当前窗口current的堆栈记录。* p : 新窗口 * ret : 失败返回false */BOOL win_open(POBJECT_HEAD p,UINT32 pass_data) if(obj_check_valid(p) = TRUE) menu_stack_push(p); return TRUE; else return FALSE;/* * win_enter_root - 清除所有菜单,并打开新的窗口。该操作相当于CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT * * p : 新的窗口 */BOOL win_enter_root(POBJECT_HEAD p,UINT32 pass_data) if(obj_check_valid(p) = TRUE) menu_stack_pop_all(); menu_stack_push(p); return TRUE; else return FALSE;win_enter_root与win_open实现说明:菜单内部的首先把新菜单压进堆栈里,然后返回,把控制权归还给control的菜单管理中心,control的菜单管理中心检查菜单堆栈数组是否与之前不一致,然后去决定是否打开新的菜单。void menu_message_proc(UINT32 msg_type, UINT32 msg_code) POBJECT_HEAD topmenu,newmenu; PRESULT proc_ret; topmenu = menu_stack_get_top(); if(topmenu != NULL) proc_ret = OSD_ObjProc(topmenu, msg_type, msg_code, 0 ); /* topmenu may be changed*/ newmenu = menu_stack_get_top(); if( topmenu = newmenu ) if(proc_ret = PROC_LEAVE) menu_stack_pop(); else /* that means PROC_LOOP or PROC_PASS */ return; /*by this time, it is safe to open next win in the stack * if the stack is NULL, it will open the default window. */ open_next_menu();/* open_next_menu: to get the window that we can stay in there.* return value: active window or NULL.*/static void open_next_menu() POBJECT_HEAD newMenu = NULL; PRESULT proc_ret = PROC_PASS; do newMenu = menu_stack_get_top(); if (newMenu != NULL) /* Open the top menu */ proc_ret = OSD_ObjOpen(newMenu,NULL); if(PROC_LEAVE = proc_ret) menu_stack_pop(); else /*newMenu = NULL*/ open_default_window(); break; while(PROC_LEAVE = proc_ret); 第三、将原control分支消息处理代码转化成一个个普通菜单。快捷键是对按键的过滤;CMD消息中CTRL_MSG_SUBTYPE_CMD_ENTER_ROOT等相关消息其实是CMD消息的过滤;同时,timer相关的唤醒操作最终将产生一个执行功能的菜单。实际上原control消息处理代码都可抽象和分离成出来,最终的结果都产生一个菜单,任何一个菜单只需关注自身的功能,只需要向菜单切换代码发送请求或者在直接调用切换函数。例如:全屏状态下的所有处理转移到win_av.c下的g_win_av;Time提示界面转移到g_win_notify,Timer后期播放处理转换到g_win_prog_name和g_win_nvod_name快捷键最终的结果是产生对应处理菜单。这些处理结果通通流经switch_to_menu函数统一做切换。任何一个菜单并不需要去关注其它不属于本菜单的事情。 菜单管理与切换中心switch_to_menuControl其它分支菜单2Control其它分支菜单1菜单3Control其它分支处理流程:Control处理分支产生一个菜单处理请求switch_to_menu新的菜单中承载功能的执行。因为把控制权交给了,所以与的执行是异步,按照原来同步的执行方式的话,与的数据传递比较方便;但异步方式,与的通信就变得相对麻烦一些。因此新版本设计了一些方法,那就是利用osd_objopen函数的第二个参数传递通信数据。每个菜单约定接收属于自己的数据结构。那么每个菜单既可以是一个调用者,也成为一个专业服务中心。任何调用者只需要发送服务端所以识别的参数结构到服务器,就可让他人替自己完成工作。这样强化模块的独立性。BOOL switch_to_menu(POBJECT_HEAD new_obj,UINT32 pass_data) POBJECT_HEAD top_menu; PRESULT ret; if(obj_check_valid(new_obj) = FALSE) return UM_FAILURE; top_menu = menu_stack_get_top(); if(UM_NULL != top_menu) ret = OSD_ObjClose(top_menu, C_DRAW_SIGN_EVN_FLG | C_CLOSE_CLRBACK_FLG);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆交运面试题库及答案
- 2025人力资源管理协议合同
- 3.1水循环(教学设计)-2024-2025学年高中地理人教版(2019)必修一
- 2025云计算平台开发技术服务合同
- 中学科二的考试题试卷及答案
- 2025劳动合同电子产品销售
- 跨境电商箱包配饰品牌品牌故事营销策略研究报告
- 2025年智能城市环境监测噪声识别技术创新
- 跨境电商箱包配饰品牌2025年海外市场品牌推广效果评估与优化
- 8.5 黄土高原的区域发展与居民生活 说课稿-2023-2024学年八年级地理下学期湘教版
- 急性胃肠炎诊疗常规
- GB/T 1735-2009色漆和清漆耐热性的测定
- 湘教版六年级下册科学实验报告单 (湘教版)
- 中小学数学专业常用词汇中英文对照
- 01第一章 井田概况及地质特征09.9
- 青岛汽轮机调速系统使用说明书
- 管理学原理(南大马工程)
- 初中语文系列 批注式阅读课件
- 六年级上册数学课件-1.3 包装的学问丨苏教版 (共19张PPT)
- 部编人教版五年级上册道德与法治全册课件
- 《临建布置方案》word版
评论
0/150
提交评论