MTK中MMI_Task的消息机制
2010-07-22 15:40
267 查看
声明:本资料来自公司同事整理
在此先简单介绍一下,Task是一个具有一定封装性的软件模块,是操作系统层面的概念,可以把它理解为一个独立的进程。
具体的调用流程:
StartTimerèStartMyTimerèStartMyTimerInt(经过封装后)èL4StartTimerè最后还是回归到操作系统的内部时钟(需要进一步研究)。
以A5上的Phonebook备份功能为例
入口函数mmi_entry_phb_backup(); ----------------------备份函数
在一系列的draw屏事件之后,我们发现了它的处理函数PBToFile()
PBToFile()
{
/*
***
*/
if (for_curr_backup_phone_total >= MAX_PB_PHONE_ENTRIES && for_curr_backup_phone_total < MAX_PB_PHONE_ENTRIES + g_phb_cntx.sim_used)
{
phb_save_sim1_to_vcard_file_req();
}
/*
***
*/
}
将phb_save_sim1_to_vcard_file_req();展开,它的功能是将SIM卡1的phonebook记录写到Tcard上去。
void phb_save_sim1_to_vcard_file_req(void)
{
MSG_PHB_SET_ENRTY_REQ_STRUCT *myMsgPtr = NULL;
MYQUEUE Message;
Message.oslSrcId = MOD_MMI; //标识这条消息来源层
Message.oslDestId = MOD_L4C; //标识这条消息被发往的目标层
Message.oslMsgId = PRT_PHB_SET_ENTRY_REQ;
//在消息机制中还需定义一个对应的消息ID
Message.oslDataPtr = (oslParaType*) myMsgPtr; //此消息所要传递数据信息
Message.oslPeerBuffPtr = NULL; //以及要返回的消息
SetProtocolEventHandler(phb_save_sim1_to_vcard_file_rsp, PRT_PHB_SET_ENTRY_RSP);
OslMsgSendExtQueue(&Message);
}
这样做处理的优点在于,不用因为大量的数据处理所带来的空间及时间上的消耗而使MMI层其他的处理事件受影响,而是将这项“工作”转交给L4C层,让它来进行处理,在这些消息的发送与接收过程消耗的时间基本上是毫秒级别的,所以不用担心有何滞后影响。
交给L4C层后,它在SetProtocolEventHandler(PsFuncPtr , U16 eventID)函数中会将对应的处理函数注册到L4C层的函数栈中,进而进行处理。
而且此功能也匹配了相应的错误处理机制,举例来讲,如果在备份过程中发生电话,短信等事件会如何呢?
来看这一段
mmi_entry_phb_backup()
{
/*
***
*/
if (0 == backup_state)
{
SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
else if (1 == backup_state)
{
ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);
SetRightSoftkeyFunction(mmi_phb_backup_pause, KEY_EVENT_UP);
}
else if (2 == backup_state)
{
SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
else if (3 == backup_state)
{
ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
/*
***
*/
}
其中有一个flag标识变量backup_state,比如在backup_state = 2时,就是所谓的暂停过程,进行相应的处理。
还有在phb_save_sim1_to_vcard_file_rsp()的函数头也有进行相应的逻辑控制
phb_save_sim1_to_vcard_file_rsp()
{
if (2 == backup_state || 0 == backup_state)
return;
/*
***
*/
}
如果在暂停等非正常状态下,函数会return掉,不会再进行处理。
在此先简单介绍一下,Task是一个具有一定封装性的软件模块,是操作系统层面的概念,可以把它理解为一个独立的进程。
具体的调用流程:
StartTimerèStartMyTimerèStartMyTimerInt(经过封装后)èL4StartTimerè最后还是回归到操作系统的内部时钟(需要进一步研究)。
以A5上的Phonebook备份功能为例
入口函数mmi_entry_phb_backup(); ----------------------备份函数
在一系列的draw屏事件之后,我们发现了它的处理函数PBToFile()
PBToFile()
{
/*
***
*/
if (for_curr_backup_phone_total >= MAX_PB_PHONE_ENTRIES && for_curr_backup_phone_total < MAX_PB_PHONE_ENTRIES + g_phb_cntx.sim_used)
{
phb_save_sim1_to_vcard_file_req();
}
/*
***
*/
}
将phb_save_sim1_to_vcard_file_req();展开,它的功能是将SIM卡1的phonebook记录写到Tcard上去。
void phb_save_sim1_to_vcard_file_req(void)
{
MSG_PHB_SET_ENRTY_REQ_STRUCT *myMsgPtr = NULL;
MYQUEUE Message;
Message.oslSrcId = MOD_MMI; //标识这条消息来源层
Message.oslDestId = MOD_L4C; //标识这条消息被发往的目标层
Message.oslMsgId = PRT_PHB_SET_ENTRY_REQ;
//在消息机制中还需定义一个对应的消息ID
Message.oslDataPtr = (oslParaType*) myMsgPtr; //此消息所要传递数据信息
Message.oslPeerBuffPtr = NULL; //以及要返回的消息
SetProtocolEventHandler(phb_save_sim1_to_vcard_file_rsp, PRT_PHB_SET_ENTRY_RSP);
OslMsgSendExtQueue(&Message);
}
这样做处理的优点在于,不用因为大量的数据处理所带来的空间及时间上的消耗而使MMI层其他的处理事件受影响,而是将这项“工作”转交给L4C层,让它来进行处理,在这些消息的发送与接收过程消耗的时间基本上是毫秒级别的,所以不用担心有何滞后影响。
交给L4C层后,它在SetProtocolEventHandler(PsFuncPtr , U16 eventID)函数中会将对应的处理函数注册到L4C层的函数栈中,进而进行处理。
而且此功能也匹配了相应的错误处理机制,举例来讲,如果在备份过程中发生电话,短信等事件会如何呢?
来看这一段
mmi_entry_phb_backup()
{
/*
***
*/
if (0 == backup_state)
{
SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
else if (1 == backup_state)
{
ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);
SetRightSoftkeyFunction(mmi_phb_backup_pause, KEY_EVENT_UP);
}
else if (2 == backup_state)
{
SetLeftSoftkeyFunction(mmi_phb_backup, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
else if (3 == backup_state)
{
ClearKeyHandler(KEY_LSK, KEY_EVENT_UP);
SetRightSoftkeyFunction(go_back_history_for_phb_backup, KEY_EVENT_UP);
}
/*
***
*/
}
其中有一个flag标识变量backup_state,比如在backup_state = 2时,就是所谓的暂停过程,进行相应的处理。
还有在phb_save_sim1_to_vcard_file_rsp()的函数头也有进行相应的逻辑控制
phb_save_sim1_to_vcard_file_rsp()
{
if (2 == backup_state || 0 == backup_state)
return;
/*
***
*/
}
如果在暂停等非正常状态下,函数会return掉,不会再进行处理。
相关文章推荐
- MTK中MMI_Task的消息机制
- MTK定时器消息机制分析 (转载)
- MTK定时器消息机制分析
- MTK之MMI_Task
- MTK平台学习----消息通讯机制
- AsnycTask的内部的实现机制
- 安卓消息处理机制(Looper,Handler,Message)
- IM消息送达保证机制实现(二):保证离线消息的可靠投递
- iOS消息推送机制的实现
- android的消息处理机制(图+源码分析)——Looper,Handler,Message
- 移动手机消息推送机制
- iOS开发系列--通知与消息机制
- iOS开发系列--通知与消息机制
- 【SICP读书笔记(二)】使用过程来黏合数据 —— 酷炫吊的消息传递机制
- WPF通过消息机制实现进程间通信(IPC)
- Android应用程序消息处理机制(Looper、Handler)分析(2)
- Windows消息机制3
- 事件处理机制之Handler消息传递机制浅析
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- IOS、Andriod、WP8 三大系统后台运行及消息推送机制