Symbian 之活动对象
2010-04-20 16:03:00 来源:WEB开发网IMPORT_C void SetActive ();
virtual void DoCancel () = 0;//两个纯虚函数,继承类必须实现它们
virtual void RunL () = 0;//处理函数
IMPORT_C virtual TInt RunError (TInt aError);
public:
TrequestStatus iStatus;//代表请求状态
…….
private:
TBool iActive;
…….
}
通过上面的CActive声明可以看出:活动对象和线程类似,构造时也会有一个优先级值来决定它们如何被调度,通常为活动对象提供一个标准优先级 EPriorityStandard。当活动对象响应的异步服务完成时,就会产生一个事件。活动调度器会侦测到事件,并决定每个事件对应的是哪个活动对象,然后调用恰当的活动对象去处理事件。当活动对象处理事件时,直到事件处理函数返回到活动调度器,该对象都是无法被抢占的,也就是说,RunL()事件处理函数是一个原子操作。
在Symbian OS中,活动对象相互协作并顺序的实现多任务,也不需要对共享的资源进行同步保护。另外,因为活动对象在同一个线程中运行,所以可以更容易地共享内存和对象,尽管活动对象存在于同一线程,但它们仍然是各自独立运行的,这就好像同一个进程中的线程是独立运行的一样。
三、关于活动对象基类CActive的几点说明:
参照上面CActive的声明
1、 必须在发布请求时调用SetActive(),否则活动对象规划器在搜索已完成的活动对象时忽略它,从而导致错误。需要说明的是,在CActive这个基类中,并没有任何实际的函数用来发布异步请求,我们自己必须编写这种函数,通常取名为StartL()。
2、 ()是个纯虚函数,必须实现该函数以提供未完成请求所需的功能。但是,需要注意:绝对不应该直接调用该函数,应该总是使用Cancel(),该函数调用 DoCancel(),同时确保设置必须的标志,从而表明请求已完成。DoCancel
3、 ()是原子操作,当它被活动规划器调度后,相同线程里,其他任何RunL()都不可以运行,直到这一RunL()完成并返回,因此该方法必须简短,否则,用户就会感到等待事件较长,手机好像死机了一样。RunL
4、 如果RunL()异常退出,则调用RunError()(由活动规划器调用),它为活动对象提供处理自身错误的机会。如果能够处理错误,RunError()就应该返回KErrNone;否则,它应该只是返回作为参数传递的错误码,在这种情况下,将错误传递到活动规划器的
更多精彩
赞助商链接