Symbian C++基础之活动对象(Active Objects)
2010-03-22 16:29:00 来源:WEB开发网内核调度器挂起当前的线程,其他线程被切换为当前线程时, 会发生上线文切换(context switch)(例如, 如果一个线程阻塞了,已经用完了它的时间片,或者更高优先级的线程要准备运行了). The context switch incurs a runtime overhead in terms of the kernel
scheduler and, if the original and replacing threads are executing in
different processes, the memory management unit and hardware caches.
在Symbian C++中, 活动对象是一个从CActive基础类继承下来的类. 它们的管理和调度由CActiveScheduler类来处理.
CActive
一个活动对象必须直接或者间谍地从CActive类进行继承. CActive定义在e32base.h中, CActive类是一个抽象类(abstract class),只有两个纯虚函数(pure virtual function) RunL() 和 DoCancel()
构造
在构造函数中,从CActive继承来的类,必须调用基类的保护的构造函数, 传递一个参数来设置活动对象的优先级. 如果线程一样,所有的活动对象必须有一个优先级,来决定他们如何被调度. 这个优先级只用来决定事件处理器运行的顺序, 而不是重新调度它们.
在类CAtive里面枚举TPriority定义了一组优先级的值。 一般而言, 应该使用CActive::EPriorityStandard(=0)的优先级,除非有更好的理由使用别的值.
在构造函数中, 活动对象应该也调用CActiveShedulerL::Add()来添加它自己到活动调度器中.
——————
CActiveScheduler::Add( this);
——————
发出请求
活动对象应该提供一个公用方法来发送请求到异步服务提供者, 然后把自己设置为活动的(以便活动调度器等待它完成). 这个方法的实现应该服从一个标准模式:
1. 检查未完成的请求(outstanding requests)
活动对象不能有超过1个的未完成的请求, 在尝试提交新的请求前, 活动对象必须检查,看是否已经在等待请求的完成. 如果是,有几种不同的方法来处理
—恐慌 这种情况只会在编程错误时才可能出现
—拒绝提交新的请求 尝试发出多个请求是合法的,但是会失败,知道原有的请求完成
—取消未完成当前请求,然后提交新的请求
更多精彩
赞助商链接