您的位置:首页 > 产品设计 > UI/UE

关于ucgui多应用调度框架解析

2016-06-15 22:59 591 查看
何为ucgui多应用开发?此处我们可以以手机为例说明。最初的手机只能运行一个应用,不存在后台运行。这样子从操作系统层面可以理解为所有的交互应用都在一个进程内运行。

那么手机那么多的应用又是如何在一个进程内和谐的运行交替的呢?本文主要介绍一种机制,也是ucgui官方推荐的一种机制。就是利用函数指针数组进行统一的应用管理,每个应用入口抽象为一个函数。

下面以一个例程为例:

程序的基本出发点主要是通过index序号去指定调用哪个APP,采用了函数指针数组的方式组织管理APP。并利用枚举的方式使枚举变量与APP在数组中的序号一致。如果软件设计没有适当地编程,仅仅升级更好硬件是没有用的。尽管处理器的速度和效率得到了逐步增强,该软件的功能和服务也越来越多,导致了相应的系统开销,整体软件服务的效果也不会有所提升。因此,足以可见应用之间的调度管理是尤为重要。
       在AppFrame.h头文件中,定义了这样一个枚举变量类型:
typedef enum {
       APP_MainMenu=0,
       APP_Calendar,
       APP_StopWatch,
       APP_Clock,
       APP_Led,
       APP_Calculator,
       APP_AllNums
}AppIndex_ForUISystem;
同时,我们也在AppConf.c源文件中定义这样一个函数指针数组:
static void(*_apfTest[])(void) = {
       MainTask_AppMenu,
       MainTask_AppCalendar,
       MainTask_AppStopWatch,
       MainTask_AppClock,
       MainTask_AppLed,
       MainTask_AppCalculator,
       0
};
此处,我们应该注意函数指针数组中每个App的应用序号应与枚举变量的APP序号一致;如主菜单的应用MainTask_AppMenu在数组中序号index为0,所以在枚举变量中定义APP_MainMenu为0;在AppCommon.h中还需进行外部调用声明:
/*App Functions*/
void MainTask_AppMenu(void);
void MainTask_AppCalendar(void);
void MainTask_AppStopWatch(void);
void MainTask_AppLed(void);
void MainTask_AppClock(void);
void MainTask_AppCalculator(void);
所有的APP均在MainTask中被_Main函数循环调用:
static void _Main(void)
{
       for (_iAppIndex= APP_MainMenu; _pConfig.apFunc[_iAppIndex];)
       {
              (*_pConfig.apFunc[_iAppIndex])();
              _Pressed= 0;
       }
       _iAppIndex= APP_MainMenu;
}
为了便于应用间的切换与窗口资源的注销,我们设置了一系列调度接口函数:

int GUI_SetCancel(int appindex):将appindex的应用设为退出状态;
void GUI_SetAppIndex(int appindex):将appindex的应用设为将要调用活跃的应用;
int GUI_CheckCancel(int appindex):检查appindex的应用是否被设为退出状态。

因此,针对单个应用的编程,采用了如下的框架:

 


图5-2  独立应用设计框图
       由于我们采用的是主菜单-子应用的组织方式,原则上独立的应用退出后应返回到主菜单应用上。当然,理论上调用任何已注册的应用均是被允许的。所以在每个独立的应用上设置了EXIT的button控件,其button的回调处理如下为:
GUI_SetAppIndex(APP_MainMenu);//设置下一个要进入的应用
GUI_SetAppDirection(MEMDEV_ANIMATION_LEFT);  
_MoveShiftWindow(&pMsg->hWin,MEMDEV_ANIMATION_RIGHT, 1, 1);
GUI_SetCancel(APP_Calendar);//要退出的当前应用
GUI_ClearHalt();
当button被按下时,便会触发回调机制,将APP设为退出状态,并调用APP_MainMenu应用。
传送门:git地址
欢迎大牛指教
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ucgui UI开发