簡單說說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狀態等).

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