Symbian C++基础之活动对象(Active Objects)
2010-03-22 16:29:00 来源:WEB开发网活动对象在Symbian C++中用做事件驱动的多任务的处理. 是敏捷(responsive)和高效(efficient)事件处理的基础.
大多数以前有实时编程经验的开发者,在用Symbian C++时,会自动假定他们应该也在多任务活动中使用线程.然而,通常不是这种情况. 除非明确需要抢先多任务(pre-emptive multitasking)功能, 那么就应该优先使用活动对象.
线程是抢先多任务的,而活动对象却不是; 当抢先行为不是必须的时候. 活动对象被特别设计成线程的一个更高效的替代品(举例,它们避免线程上下文切换的开销)
线程, 进程, 进程间通信的问题, 请参考 RThread API
活动对象框架
活动对象框架在Symbian C++中用来简化异步编程. 用来在同一个线程里处理多个异步任务, 提供一致的写代码的途径,来提交异步请求和处理完成事件(completion events)
同步 与 异步 代码
同步函数执行它立即提供的服务, 并且只有在完成时,才将控制权返回给调用者(caller)
异步函数,会立刻将控制权返回给调用者, 被请求的服务被执行一段时间后, 调用者将收到一个服务已经完成的信号. 这个信号叫做事件(event). 这个代码被称做事件驱动(event-driver) . 在调用者等待完成事情时,它可执行其他的必要的处理,故而能快速响应用户,或者能进入低功耗状态进行等待. 事件由时间处理器(event handler)管理, 顾名思义,它等待一个时间,然后处理(handl)它,,或者为异步服务重新提交一个请求. 操作系统必须有个高效率的事件处理模型来让出现的事件尽可能快地被处理 . 如果同时有多个事件出现, 响应必须以最合适的顺序出现(用户驱动的事件应该被快速处理,这样才有好的用户体验)
活动对象封装了任务, 它向服务提供者请求一个异步的服务, 当活动调度器(active sheduler)调用它是,它就 处理完成事件(completion event)
活动调度器决定了哪个活动对象同事件关联,并在处理该事件是,调用合适的活动对象.
抢占
在单个线程内, 活动对象框架使用非抢先式多任务. 一旦调用后, , 这个事件处理器必须在任何其他的活动对象时间处理器能运行前, 一直运行到完成—也就是说,它不能被抢占.
一些事件要求严格在保证的时间内响应, 而不管系统中其他的活动(比如,底层的电话或者视频处理). 这些叫做实时事件处理. 活动对象不适合做实时任务, 在Symbian C++上, 实时任务应该用高优先级的线程来实现. Symbian C++的线程由内核进行抢占式调度, 内核运行在一个最高优先级的线程里.
更多精彩
赞助商链接