永遠活在同步的流程里,無疑是我等碼工最大的奢
望之一,。為了不阻塞UI,,為了讀寫一陀陀數(shù)據(jù),為了含辛茹苦的演算復雜的邏輯,,為了大家和睦相處共同勞動,,總是需要異步處理,你一下我一下共同完成任務,。
在Symbian中,,做了一套機制來做這件事情,這就是Active Objects,。
Active ObjectsActive
Object是一套事件驅動的多任務模型,。在Symbian的標準線程中(除掉一些Java構造線程、原生C構造線程,,等),,都包含有一個消息循環(huán),在循
環(huán)中,,會不停的查詢注冊在該線程所屬的CActiveScheduler各個ActiveObject的TRequestStatus狀態(tài),,一旦發(fā)現(xiàn)可執(zhí)
行的任務,立馬激活并執(zhí)行,。經(jīng)典的循環(huán)偽碼如下:
// *** in the loop *** 一碼解千語,。在消息循環(huán)中,會等待事件激活,,接
著,,會遍歷查詢注冊各個Active Object的狀態(tài)。當然,,簡單的遍歷是不夠體面的,,每個Active
Object都是帶著優(yōu)先級來的,毫無疑問,,優(yōu)先級高的會被優(yōu)先考慮執(zhí)行,,低的永遠也超越不了,。默認,,大家都使用EPriorityStandard,一
切太平,。如果,,一個Active
Object是需要長時間被執(zhí)行的,,可以考慮使用低優(yōu)先級,EPriorityIdle,、EPriorityLow,,這樣執(zhí)行的頻率會低一些。而如果任務
是具有一些實時要求的,,就需要使用高的優(yōu)先級,,亦如,EPriorityUserInput,、EPriorityHigh,。
但這個模型,是不足夠滿足實時要求的,,因為它是
非搶占式的,。一個低優(yōu)先級的任務,被調度了,,在那里磨嘰磨嘰,,你優(yōu)先級再高也奈何不了。在這種模式下,,要保持良好的響應能力,,需要自律。首先,,如果一個任
務的實時性高,,那么就需要調高它執(zhí)行線程或進程的優(yōu)先級,讓它優(yōu)先被CPU調度,,不給低優(yōu)先級任務執(zhí)行的機會,。還有,就是不要在Active
Object的RunL中放置執(zhí)行效率低下的代碼(如果是非主線程,,那就看菜下飯了...),,它會使得該線程失去響應其他請求的能力。
每個異步的任務,,都需要派生自CActive類,。如果用系統(tǒng)向導,可以發(fā)現(xiàn),,Symbian希望每個CActive的子類,,做以下幾件事情:
任務驅動的控制核心在于
TRequestStatus,,執(zhí)行一方在接到任務后,會將TRequestStatus設置成為KRequestPending,,當這個狀態(tài)被再次改變
了,,才會觸發(fā)CActiveScheduler調度執(zhí)行回調。整個流程如下圖所示(依然是盜竊來的...):
Client-Server框架Client-Server框架,,是
Symbian的重要機制,。在Symbian的內核層面,大量使用該模式,,將文件管理,,界面管理等功能都剝離到了各個服務中,呈微內核態(tài)勢,。所謂
Client-Server框架,,就是功能調用者Client,和功能執(zhí)行者Server,,各據(jù)一方,,處于不同的線程或進程。它們搭建在Active
Object上,,通常通過異步模式進行調用,。不過,Client-Server并沒有對執(zhí)行模式進行約束,,比如文件服務,,就具有同步和異步兩種調用模式,
當然,,本質上換湯不換藥,,所謂同步只是阻塞異步來實現(xiàn)的。
Client-Server分同進程和跨進程兩
種,,不用說,,通信模式完全不一樣,。在跨進程模式下,需要通信,,就需要在Client和Server之間建立一個Session,。Session是對
Symbian
IPC的封裝,,用協(xié)定方式進行通信,,只不過,大數(shù)據(jù)的傳輸還需要各行其道各顯神通,。而同進程下,,傳遞信息就簡單多了,很多時候,,同用一個指針就好,。在跨進
程模式下,適合集中控制,,統(tǒng)一管理資源,,特適合想文件服務這樣的東東。而同進程,,則適合大數(shù)據(jù)的傳輸,,和邏輯的運算,各開各的線程,,各跑各的邏輯,。
結語和同步相比,異步無疑是殘酷的,,但有了這些框架,,比吭哧吭哧動手搞線程,搞通信來的開心多了,。Symbian有這點能有的東西,,還真不容易*_*。
|
|