Symbian 编程之活动对象正解
2010-03-18 20:58:00 来源:WEB开发网2、有两个虚方法必须继承:
virtual void DoCancel() =0; virtual void RunL() =0;RunL方法:活动调度器接收到异步函数返回的“完成”消息后,遍历在其注册的所有活动对象,如果活动对象的iActive = ETrue且iStatus != KRequestPending则调用活动对象的RunL方法,并将iActive设置成EFalse,以防下次轮询时仍然调用此活动对象。
在这里“RunL”这个名字会让很多人产生歧义,我刚开始接触的时候总以为和J2me中的Runnable接口的run方法差不多。其实在这里把 “RunL”改为“NotifyRequestCompleteL”更贴切些。
再次声明一下,调用异步函数时,参数 TRequestStatus& status都是以引用的方式传递的,如:
IMPORT_C void After(TRequestStatus &aStatus, TTimeIntervalMicroSeconds32 anInterval);
所以异步函数内部可以改变status的实参,也就是改变活动对象的类成员iStatus。
DoCancel() 方法:基类CActive中有取消异步函数的方法Cancel(),调用Cancel()后,活动对象会通过DoCancel()方法通知应用程序做取消方法的后期工作,如删除对象及回收指针等。注意:在应用程序中如果想终止活动对象,要使用Cancel()方法调用而不是DoCancel()方法。
3、活动对象的带优先级的构造函数:
基类CActive的构造函数原型如下:
protected: IMPORT_C CActive(TInt aPriority);此处将传入一个优先级枚举值,枚举值内容如下:
/**Defines standard priorities for active objects.*/enum TPriority { /** A low priority, useful for active objects representing background processing. */ EPriorityIdle=-100, /** A priority higher than EPriorityIdle but lower than EPriorityStandard. */ EPriorityLow=-20, /** Most active objects will have this priority. */ EPriorityStandard=0, /** A priority higher than EPriorityStandard; useful for active objects handling user input. */ EPriorityUserInput=10, /** A priority higher than EPriorityUserInput. */ EPriorityHigh=20, };当调用CActiveScheduler::Add方法注册活动对象时,活动调度器会按照活动对象的优先级进行排序,插入或添加到活动对象集合中。在此会起到如下作用:当多个异步函数消息同时返回时(多个iStatus同时不为KRequestPending),活动对象调度器轮训集合的时候总是会先找到优先级高的活动对象并调用其RunL方法。
更多精彩
赞助商链接