简单说说Symbian 活动对象(CActive)的工作机制

一个活动对象在一个活动调试器(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状态等).

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章