久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Symbian手記【五】 —— Symbian的異步框架

 My鏡像站 2011-11-16
永遠活在同步的流程里,無疑是我等碼工最大的奢 望之一,。為了不阻塞UI,,為了讀寫一陀陀數(shù)據(jù),為了含辛茹苦的演算復雜的邏輯,,為了大家和睦相處共同勞動,,總是需要異步處理,你一下我一下共同完成任務,。 在Symbian中,,做了一套機制來做這件事情,這就是Active Objects,。

Active Objects

Active 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 ***

User::WaitForAnyRequest();

FOREVER
    {
    if(activeObject->IsActive()  && activeObject->iStatus != KRequestPending)
        {
        activeObject->iActive = EFalse;
        TRAPD(r, activeObject->RunL());
        if( r != KErrNone )
            {
            r = activeObject->RunError();
            if( r != KErrNone )
                Error(r);
            }
        break;
        }
    }
一碼解千語,。在消息循環(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的子類,,做以下幾件事情:
  • 實現(xiàn)RunL,放置等待回調一方的執(zhí)行代碼,;
  • 實現(xiàn)DoCancel方法,,把未有機會到達目的地的任務妥善安置,這是一個模板方法模式,它會被放在Cancel,,僅在狀態(tài)為執(zhí)行時,,會被調用;
  • 實現(xiàn)RunError,,在執(zhí)行出錯后,,給該CActive子類一次自我救贖的機會;
  • 嘗試告訴使用者,,這世界沒有免費的午餐,,需要用SetActive將請求發(fā)送給那個執(zhí)行者,讓它幫你搞定問題,。
任務驅動的控制核心在于 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有這點能有的東西,,還真不容易*_*。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多