一个活动对象在一个活动调试器(CActiveScheduler) 运行的两个标志,
1. 是CActive::iActive =ETrue;
2. 有iStatus值(KErrNone)
a) CActive里有两个纯虚方法必须得实现的: RunL()与DoCancel,另外还有一个RunError(TInt aError);虚方法,这个方法用处不多,这里我最主要讲SetActive()与DoCancel方法的正确使用
RunL()方法大家都知道,是活动对象在激活(SetAction()),iStatus状态改变后,活动调试器(CActiveScheduler) 调用的方法,而这个iStatus请求状态必须得与一个异步方法关联在一起,如:
RTimer iTimer;
User::LeaveIfError(iTimer.CreateLocal()); //创建一个时间点
iTimer.After(iStatus,1); //注意与一个异步函数关联
CActive::SetActive();
如果没有一个异步方法与之关联,活动对象将会有信号丢失,在程序退出时,
活动调试器(CActiveScheduler) 将会在一个死循环里出不来(也就是程序没能完全退出) (因为无法把iActive这个状态复原),如下代码,在程序退出时,应用程序无法把活动调试器(CActiveScheduler)卸载掉,也就是程序并不能完全退出,可能退出的只是UI界面.
CActive::SetActive();//程序将会立刻进入RunL方法,运行完全,信号丢失,活动调试器(CActiveScheduler)无法卸载掉,
b) doCancel()方法运行的前提条件必须得是活动对象活动的状态,也就是iActive=ETrue状态.
另外活动对象在 活动状态的时候,不能直接调用doCancel(),否则程序弹出,内存泄露错误,
我猜,在调用Cancel()方法时,不单只是简单的调用doCancel()方法,可能还做了些状态复原之类的工作(像iActive与零 iStatus状态等).