关于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的应用是否被设为退出状态。
因此,针对单个应用的编程,采用了如下的框架:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202007/31/4033eaacbb3b00459700350889026c7c)
图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官方推荐的一种机制。就是利用函数指针数组进行统一的应用管理,每个应用入口抽象为一个函数。
下面以一个例程为例:
程序的基本出发点主要是通过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地址
欢迎大牛指教
相关文章推荐
- Cocos2d-x UI开发之CCControlPotentiometer控件类使用实例
- Cocos2d-x UI开发之菜单类使用实例
- Cocos2d-x UI开发之CCControlColourPicker控件类使用实例
- Android界面效果UI开发资料汇总(附资料包)
- Cocos2d-x UI开发之CCControlSlider控件类使用实例
- Cocos2d-x UI开发之场景切换代码实例
- Cocos2d-x UI开发之CCControlSwitch控件类使用实例
- 基于STM32的UCOS和UCGUI对单色屏LCD19264的开发
- 解决ucgui控件中双字节字符显示和换行的Bug
- 关于解决字符乱码问题及对ucGUI底层实现字符显示的浅析
- uCGUI 5.22 在stm32 上的移植
- ucgui 嵌入式 输入法 包含拼音、笔画、英文、数字与符号的完整输入法软件
- UCGUI/emWIN给按钮添加背景图片
- emWin实战指南
- scrollView中contentOffset与contentInset比较(粗浅理解)
- ios开发出现fatal error: unexpectedly found nil while unwrapping an Optional value
- uCGUI 按键窗口切换机制
- stm32 ucgui无触屏移植
- STM32+uCGUI优化 及R61505w驱动
- 手把手教你在STM32上移植ZNFAT文件系统