- 浏览: 2016515 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (795)
- java (263)
- 聚类搜索引擎 (9)
- 经验之谈 (67)
- DSP (3)
- C++ (140)
- Linux (37)
- SNMP (6)
- Python (6)
- 数据库 (61)
- 网络 (20)
- 算法 (15)
- 设计模式 (4)
- 笔试题 (38)
- 散文 (35)
- 数据结构 (9)
- 银行知识 (0)
- 榜样 (9)
- Lucene (15)
- Heritrix (6)
- MetaSeeker (0)
- netbeans (12)
- php (3)
- 英语 (8)
- DB2 (0)
- java基础 (5)
- mongodb & hadoop (4)
- Javascript (7)
- Spring (4)
- ibatis & myibatis (1)
- velocity (1)
- 微服务 (0)
- paddle (1)
- 第三方 (0)
- 知识沉淀 (1)
- 建模 (0)
最新评论
-
0372:
标示对java很陌生!
中文乱码解决的4种方式 -
梦留心痕:
Java中\是转意字符, 可是你的这句话我没看懂,只要把得到的 ...
java中如何忽略字符串中的转义字符--转载 -
yanjianpengit:
[b][/b]
java为什么非静态内部类里面不能有静态成员 -
springdata-jpa:
可以参考最新的文档:如何在eclipse jee中检出项目并转 ...
eclipse 如何把java项目转成web项目 -
qq1130127172:
,非常好。
(转)SpringMVC 基于注解的Controller @RequestMapping @RequestParam..
摘要:回调机制是BREW平台中最关键的机制之一,很多接口类都是通过回调机制呈现在开发人员的面前,《对AEECallback结构体及其基础函数的分析》中队brew/src/thrdutil中的一些源代码进行分析,初略的理解了AEECallback结构体及其相关函数的实现,对开发能有一定的帮助,本文则更加深入的分析了该机制的特点,以及高通工作人员给出的一些答案。
注:非常感谢手机之家_开发联盟的superant, 东方欲晓, record等人,是他们激烈的讨论才引出了最后的答案。本文很多内容都摘自他们的帖子。
BREW平台的回调机制,通常是异步的,举例来说,在网络通信的时候,如果是发送数据,普通的方式是发送一快数据,判断是否发送成功,如果发送不成功,则空闲一段时间,在调用发送数据的函数,如此往复,但是如果在BREW平台上,调用发送函数发送数据,如果发送成功,函数会返回发送成功的字节数,如果返回的是-2,表示当前发送不成功,接下来,需要通过_Writeable注册一个回调函数,BREW会根据网络状况调用你注册的回调函数,继续发送需要发送的数据,直到所有数据发送成功。同样的道理,在接收数据的时候,如果数据量比较大,不是一次能够接收完,通常来说就是通过_Readable函数来注册接收回调函数,当有数据到的时候就会调用你注册的回调函数接收数据,直到所有数据接收成功。
BREW平台回调机制的实现有几个关键的部分下面一一介绍。
Callback机制中的核心数据结构:
struct _AEECallback
{
AEECallback *pNext;
void *pmc;
PFNCBCANCEL pfnCancel;
void *pCancelData;
PFNNOTIFY pfnNotify;
void *pNotifyData;
void *pReserved;
};
该结构体的每一个成员在《对AEECallback结构体及其基础函数的分析》中有介绍,在此略过。
从结构的命名中可以猜测,其实AEECallback结构体是以链表形式存在,其中的pNext成员就是起到遍历链表的作用,该链表由系统维护。
CALLBACK_Init和CALLBACK_Cancel是两个关键函数。CALLBACK_Init负责对AEECallback结构体进行初始化,该函数的参数列表第二个参数是PFNNOTIFY类型,就是需要回调的函数的函数指针类型,第三个参数是传递给该回调函数的参数指针,类型是void型指针。CALLBACK_Cancel函数是取消回调函数,也就是调用AEECallback结构体中的pfnCancel指针指向的函数来取消回调。
ISHELL_Resume()函数允许向 AEE 外壳注册回调。 它可以向 AEE 外壳的待处理操作列表中添加回调。 AEE 外壳将在下一次调用事件循环时调用此回调函数,以使应用程序或对象协同处理多任务。如果已注册回调,则会先将其注销,然后再重新注册。
举例来说,我们在APPLET里中定义m_pCB为AEECallback类型,调用CALLBACK_Init(&pme->m_pCB,FUNC1,pme),意在初始化m_pCB,将函数FUNC1注册到这个结构体中,这时候,m_pCB中的pfnNotify就指向了FUNC1,任何时候,不管是开发人员自己写代码调用ISHELL_Resume()函数,还是通过调用其它函数(BREW平台的APIs),在这些函数中有隐含的调用ISHELL_Resume(),该函数都会在BREW系统的回调链表中添加一个节点,该节点就是m_pCB,那么在适当的时候,BREW就会调用你的FUNC1函数。其实在很多BREW APIs中都会有调用ISHELL_Resume(),例如ISHELL_SetTimerEx()函数,不过这个只是猜测,因为根本无法看到该这些函数的原代码。
归纳起来,如过要使用BREW平台的回调机制,则只要初始化适当的AEECallback结构体,再在需要回调的时候调用ISHELL_Resume来启动回调函数 。
下面来叙述一下BREW平台的消息机制和回调机制的大概流程:
我们假设BREW运行于Ui Task,特定于BREW的Sig为AEE_APP_SIG。
For(;;)
{
waitfor sig // 无限循环,捕捉到相应的Sig后,作相应的处理
}
if (receive aee app sig)
{
AEE_Dispatch // 如果收到AEE_APP_SIG 说明BREW需要执行,调用AEE_Dispatch进行消息循环分发。
}
其中AEE_Dispathc是最关键的函数,他会检查BREW事件队列中的所有事件一一分发(调用APP->HandleEvent函数),同时也会检查Callback队列中注册的Callback,一一回调。所有都处理完后,表示本次BREW循环结束,将运行环境切换回UI Task中的其他非BREW程序,或者切换至其他Task。当下次BREW再需要执行时,BREW将再次设置AEE_APP_SIG,从而导致当系统任务调度到UI Task时,AEE_Dispatch再次被调用,以此往复。
关于在ISHELL_Resume注册完回调函数之后,具体会在什么时候调用回调函数,这个并没有深究的价值,在Callback对列中,BREW根据自身的算法选择回调,当一个时间片不够回调所有的Callback的话,则会把未完成的Callback放到下一个或者下几个时间片执行。所以,对于正常的概念来说,只需要知道,当执行了ISHELL_Resume之后,很短的时间内BREW会调用完成Callback的调用。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiyucn/archive/2006/01/24/587744.aspx
注:非常感谢手机之家_开发联盟的superant, 东方欲晓, record等人,是他们激烈的讨论才引出了最后的答案。本文很多内容都摘自他们的帖子。
BREW平台的回调机制,通常是异步的,举例来说,在网络通信的时候,如果是发送数据,普通的方式是发送一快数据,判断是否发送成功,如果发送不成功,则空闲一段时间,在调用发送数据的函数,如此往复,但是如果在BREW平台上,调用发送函数发送数据,如果发送成功,函数会返回发送成功的字节数,如果返回的是-2,表示当前发送不成功,接下来,需要通过_Writeable注册一个回调函数,BREW会根据网络状况调用你注册的回调函数,继续发送需要发送的数据,直到所有数据发送成功。同样的道理,在接收数据的时候,如果数据量比较大,不是一次能够接收完,通常来说就是通过_Readable函数来注册接收回调函数,当有数据到的时候就会调用你注册的回调函数接收数据,直到所有数据接收成功。
BREW平台回调机制的实现有几个关键的部分下面一一介绍。
Callback机制中的核心数据结构:
struct _AEECallback
{
AEECallback *pNext;
void *pmc;
PFNCBCANCEL pfnCancel;
void *pCancelData;
PFNNOTIFY pfnNotify;
void *pNotifyData;
void *pReserved;
};
该结构体的每一个成员在《对AEECallback结构体及其基础函数的分析》中有介绍,在此略过。
从结构的命名中可以猜测,其实AEECallback结构体是以链表形式存在,其中的pNext成员就是起到遍历链表的作用,该链表由系统维护。
CALLBACK_Init和CALLBACK_Cancel是两个关键函数。CALLBACK_Init负责对AEECallback结构体进行初始化,该函数的参数列表第二个参数是PFNNOTIFY类型,就是需要回调的函数的函数指针类型,第三个参数是传递给该回调函数的参数指针,类型是void型指针。CALLBACK_Cancel函数是取消回调函数,也就是调用AEECallback结构体中的pfnCancel指针指向的函数来取消回调。
ISHELL_Resume()函数允许向 AEE 外壳注册回调。 它可以向 AEE 外壳的待处理操作列表中添加回调。 AEE 外壳将在下一次调用事件循环时调用此回调函数,以使应用程序或对象协同处理多任务。如果已注册回调,则会先将其注销,然后再重新注册。
举例来说,我们在APPLET里中定义m_pCB为AEECallback类型,调用CALLBACK_Init(&pme->m_pCB,FUNC1,pme),意在初始化m_pCB,将函数FUNC1注册到这个结构体中,这时候,m_pCB中的pfnNotify就指向了FUNC1,任何时候,不管是开发人员自己写代码调用ISHELL_Resume()函数,还是通过调用其它函数(BREW平台的APIs),在这些函数中有隐含的调用ISHELL_Resume(),该函数都会在BREW系统的回调链表中添加一个节点,该节点就是m_pCB,那么在适当的时候,BREW就会调用你的FUNC1函数。其实在很多BREW APIs中都会有调用ISHELL_Resume(),例如ISHELL_SetTimerEx()函数,不过这个只是猜测,因为根本无法看到该这些函数的原代码。
归纳起来,如过要使用BREW平台的回调机制,则只要初始化适当的AEECallback结构体,再在需要回调的时候调用ISHELL_Resume来启动回调函数 。
下面来叙述一下BREW平台的消息机制和回调机制的大概流程:
我们假设BREW运行于Ui Task,特定于BREW的Sig为AEE_APP_SIG。
For(;;)
{
waitfor sig // 无限循环,捕捉到相应的Sig后,作相应的处理
}
if (receive aee app sig)
{
AEE_Dispatch // 如果收到AEE_APP_SIG 说明BREW需要执行,调用AEE_Dispatch进行消息循环分发。
}
其中AEE_Dispathc是最关键的函数,他会检查BREW事件队列中的所有事件一一分发(调用APP->HandleEvent函数),同时也会检查Callback队列中注册的Callback,一一回调。所有都处理完后,表示本次BREW循环结束,将运行环境切换回UI Task中的其他非BREW程序,或者切换至其他Task。当下次BREW再需要执行时,BREW将再次设置AEE_APP_SIG,从而导致当系统任务调度到UI Task时,AEE_Dispatch再次被调用,以此往复。
关于在ISHELL_Resume注册完回调函数之后,具体会在什么时候调用回调函数,这个并没有深究的价值,在Callback对列中,BREW根据自身的算法选择回调,当一个时间片不够回调所有的Callback的话,则会把未完成的Callback放到下一个或者下几个时间片执行。所以,对于正常的概念来说,只需要知道,当执行了ISHELL_Resume之后,很短的时间内BREW会调用完成Callback的调用。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/jiyucn/archive/2006/01/24/587744.aspx
发表评论
-
DLL中导出函数的声明有两种方式:
2012-11-12 16:42 1815DLL中导出函数的声明有两种方式: 一种方式是:在函数声明中 ... -
k-means算法的C++实现
2011-04-05 11:38 2302k-means算法的C++实现: http://www.ku ... -
main()中的参数
2010-10-31 10:41 1504所有的应用程序都是从以main函数作为入口, 而mai ... -
static作用
2010-10-26 19:15 2343转自(from http://www.cnb ... -
mmap函数
2010-10-25 22:41 1886mmap函数的使用方法 UNIX ... -
C语言中三种内存分配方式
2010-10-25 20:23 01.malloc 原型:extern void *ma ... -
位拷贝和值拷贝
2010-10-23 15:37 1567为了便于说明我们以String类为例: 首先定义String ... -
(转帖)把类的析构函数写成虚函数的用意
2010-10-23 15:10 1666#include <iostream.h> cl ... -
动态规划/贪心算法----0/1背包问题AND普通背包问题
2010-10-23 14:03 6794两个背包问题都是比较典型的问题,对这两种算法的理解有很好的帮助 ... -
netstat, nslookup, finger, ping命令
2010-10-22 17:13 1491Netstat用于显示与IP、TCP ... -
C++返回值
2010-10-22 16:53 1522C++函数返回值: (1)正常情况下,函数的参数要复制一份在 ... -
switch语句后的表达式的值
2010-10-22 16:23 1813一般格式: switch (表达式) { case 常量 ... -
C++四种强制类型转换
2010-10-19 11:45 1536显式类型转换又被称之 ... -
C++四种强制类型转化的区别
2010-10-19 11:43 1326先介绍const_cast和reinterpret_cast: ... -
Visual C++线程同步技术剖析:临界区,时间,信号量,互斥量
2010-10-18 14:24 1801使线程同步 在程序中使用多线程时,一般很少有多个线程能在其 ... -
(转)临界区,互斥量,信号量,事件的区别
2010-10-18 14:22 1743四种进程或线程同步互斥的控制方法1、临界区:通过对多线程的串行 ... -
(转)在C++中实现同步锁,类似synchronize(object){....}
2010-10-18 13:49 1855在做C++的项目中发现, ... -
C++线程同步
2010-10-18 13:46 1584线程同步是多 ... -
C++多线程编程
2010-10-18 10:56 1724今天我给大家讲一讲C++ ... -
关于C++对函数传参与函数返回值进行引用传递的详解
2010-10-16 22:51 4027关于C++对函数传参与函数返回值进行引用传递的详解 ...
相关推荐
本文挡内容主要是 BREW 的回调机制 供大家学习研究之用
BREW平台及业务介绍BREW平台及业务介绍
BREW平台内部接口机制的探讨.pdf ,从知网下的,
5.基于BREW 平台的POC 应用研究及业务发展分析.pdf 6.基于BREW 平台的数据压缩.pdf 7.基于BREW 应用中的随机地图的铺设研究.pdf 8.基于BREW平台的手机应用绘图的优化方法.pdf 9.基于BREW与组件技术的智能手机邮件...
brew 平台文本阅读-ebook模块源代码,可供brew开发者学习与参考
BREW平台架构及基本知识介绍,很好的新手学习工具
高通Brew平台手机开发资料,Brew是高通手机的一个中间件,Brew用C语言面向接口设计,有着明显的面向接口特性。
基于BREW平台的POC应用研究及业务发展分析.pdf 基于BREW平台的多态机制实现.pdf 基于BREW平台的手机内存管理的研究.pdf 基于BREW平台的手机应用的优化方法.pdf 基于BREW平台的手机应用绘图的优化方法.pdf 基于BREW...
高通BREW平台初级技术培训资料及源码,适合初学者
修改了MCBXml源码,让它可以用于BREW平台。
brew 平台游戏及模拟器 BREW环境搭建PC版本手机版
brew 的东西,同事花钱买的
BREW平台实现的飞机的游戏 用方向键控制飞机的飞向 两侧有墙 下边有东西不断上来 飞机撞上墙或是下边的东西就死了 源码正确 可直接运行
一个使用C语言写的回调函数 包括函数的调用,函数的取消等操作。
当年电信功能手机自带的uc浏览器,有电信功能机的可以试试看
基于BREW平台的数据压缩,陈姗姗,杨敬,当前在移动通信嵌入式终端应用中,涉及图像、数据和声音处理的应用占很大比例,但由于掌上系统的存储能力和处理能力受到很大限制,因
BREW编程经验——Dialog机制的使用方式.doc
这是一个详细介绍brew平台的文档,内容丰富详尽,为读者提供了一次很好的学习机会
文档目的:由于几乎没有详细阐述 文档目的:由于几乎没有详细阐述BREW BREW接口实现机制方 接口实现机制方 面的文档,妨害了对 面的文档,妨害了对BREW BREW接口机制的学习。所以结合自 接口机制的学习。所以结合...
一款基于BREW平台的 功能齐全的电子书。支持触摸屏功能,各位分享啦!