青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個人技術空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

 

活動對象框架原理

 

一、概述:

Symbian OS是一個多任務的操作系統,那么為了實現多任務,同時使系統能夠快速響應,高效的進行事件處理,并減輕應用程序員的工作負擔(申請大多數耗時的操作(例如文件系統)由服務提供器來完成,服務提供器完成程序員提交的請求后,將會返回給程序員一個成功或失敗的信號。),Symbian OS特意引入了活動對象的概念。

服務提供器API具有函數的異步和同步版本,供客戶應用程序使用。所謂同步是指,客戶提交請求后,處于等待狀態,等待服務提供器返回成功或失敗的信號后,然后在進行其他操作;所謂異步是指,請求完成,即返回信號之前,調用者也許會繼續執行其他的處理,或者只是簡單的等待。在這里的等待,也可以稱為阻塞,信號就是一個事件,我們的代碼就是事件驅動的。為了實現多任務,一般我們使用異步API

一般操作系統為了實現多任務,往往使用多線程實現,當然,Symbian也是支持多線程的。但是,在同一個線程中運行的活動對象之間進行切換的代價要比線程上下文的切換代價低,這使得對于各種資源比較緊張的Symbian OS來說,使得活動對象更適合事件驅動多任務。

注意:

1)線程間上下文切換和同一線程的活動對象之間傳遞控制權,在速度上的差別可能會有10倍之差,另外,一個線程大約在內核中有4KB的空間開銷,在用戶空間上有8KB的用于程序棧的空間開銷,而一個活動對象的開銷可能只有幾百字節,甚至更小。

2)雖然在一個線程內的活動對象是非搶占式地協同運行的,但在它們所在的線程卻是搶占式調度的

 

二、概念:

一個活動對象必須派生自基類CActive

class CActive : public CBase

{

public:

    enum Tpriority

    {

        EPriorityIdle = -100;

        EPriorityLow = -20;

        EPriorityStandard = 0;

        EPriorityUserInput = 10;

        EPriorityHigh = 20;

    }

public:

    IMPORT_C ~CActive ();

    IMPORT_C void Cancel ();//刪除未完成請求的函數

……

    IMPORT_C void SetPriority (TInt aPriority);

    Inline TBool IsActive () const;

……

protected:

    IMPORT_C CActive (TInt aPriority);

    IMPORT_C void SetActive ();

    virtual void DoCancel () = 0;//兩個純虛函數,繼承類必須實現它們

    virtual void RunL () = 0;//處理函數

    IMPORT_C virtual TInt RunError (TInt aError);

public:

    TrequestStatus iStatus;//代表請求狀態

……

private:

    TBool iActive;

……

}

通過上面的CActive聲明可以看出:活動對象和線程類似,構造時也會有一個優先級值來決定它們如何被調度,通常為活動對象提供一個標準優先級EPriorityStandard。當活動對象響應的異步服務完成時,就會產生一個事件。活動調度器會偵測到事件,并決定每個事件對應的是哪個活動對象,然后調用恰當的活動對象去處理事件。當活動對象處理事件時,直到事件處理函數返回到活動調度器,該對象都是無法被搶占的,也就是說,RunL()事件處理函數是一個原子操作。

Symbian OS中,活動對象相互協作并順序的實現多任務,也不需要對共享的資源進行同步保護。另外,因為活動對象在同一個線程中運行,所以可以更容易地共享內存和對象,盡管活動對象存在于同一線程,但它們仍然是各自獨立運行的,這就好像同一個進程中的線程是獨立運行的一樣。

 

三、關于活動對象基類CActive的幾點說明:

參照上面CActive的聲明

1必須在發布異步請求后調用SetActive(),否則活動對象規劃器在搜索已完成的活動對象時忽略它,從而導致錯誤。需要說明的是,CActive這個基類中,并沒有任何實際的函數用來發布異步請求,我們自己必須編寫這種函數,通常取名為StartL()。

2DoCancel()是個純虛函數,必須實現該函數以提供未完成請求所需的功能。但是,需要注意:絕對不應該直接調用該函數,應該總是使用Cancel(),該函數調用DoCancel(),同時確保設置必須的標志,從而表明請求已完成。

3RunL()是原子操作,當它被活動規劃器調度后,相同線程里,其他任何RunL()都不可以運行,直到這一RunL()完成并返回,因此該方法必須簡短,否則,用戶就會感到等待事件較長,手機好像死機了一樣。

4如果RunL()異常退出,則調用RunError()(由活動規劃器調用),它為活動對象提供處理自身錯誤的機會。如果能夠處理錯誤,RunError()就應該返回KErrNone;否則,它應該只是返回作為參數傳遞的錯誤碼,在這種情況下,將錯誤傳遞到活動規劃器的Error()函數,默認行為是導致嚴重錯誤

5iStatus實際上只是一個封裝的整數,用于表示異步服務提供器返回的狀態或錯誤碼。活動對象發出請求后,服務提供器的第一個任務是將iStatus設為KrequestPending,當請求的服務完成時,服務提供器將iStatus的值設為KErrNone(如果請求成功完成)或錯誤碼。

 

四、活動對象的實現步驟:

1、構造

活動對象幾乎總是要使用二階段構造,因為活動對象通常需要連接到它們的異步服務提供器,這個連接過程可能失敗。

void CCsvFileLoader::ConstructL (const TDesC& aFileName)

{

    iFileName = aFileName;

    //RFile iFile

    User::LeaveIfError(iFile.open(iFs , iFileName , EFileRead));

    //RTimer iTimeWaster

    User::LeaveIfError(iTimeWaster.CreateLocal());

    CActiveScheduler::Add(this);

    //活動對象加到活動規劃器中,這條語句也可以放在第一階段構造函數中

}

選擇最適合活動對象的優先級,該優先級只會影響活動對象在活動規劃器的列表中的順序,實際開發時,很少使用EPriorityStandard以外的優先級。

CCsvFileLoader::CCsvFileLoader(RFs& aFs , CElementList& aElementList , MCsvFileLoaderObserver& aObserver) : CActive (EPriorityStandard)

{

    ……

}

通過句柄RTimerRFile鏈接到所需的兩個異步服務器。

警告:必須將活動對象都添加到活動規劃器中,并且只能添加一次。添加失敗將產生請求迷失的嚴重錯誤。

 

2、啟動活動對象

void CCsvFileLoader::Start( )

{

    TInt delay = (iFileName.Size() % 10) * 100000;

    iTimeWaster.After(iStatus , delay);

    SetActive();//iActive設為Etrue

}

異步服務提供器(運行在另一線程或進程中)將通過完成下面兩件事來用信號通知線程(活動對象所屬的線程)。

1)增加線程的信號量(這個信號量,一般情況用不到。只是當活動對象所屬的線程被掛起時,通過增加信號量重新喚醒這個線程,而線程的掛起通過函數WaitForAnyRequest())。

2)將給定的TRequestStatus設置為不同于KRequestPending的值(如果一切運行良好,則很有可能是KErrNone)。

3RunL()

這個函數比較復雜,它將執行大量任務:

1)決定下一次迭代應該做什么(加載數據或浪費時間)

2)檢查最后一次迭代狀態,并且將這個狀態報告給觀察器

3)處理所有加載的數據

一般活動對象的這個RunL()方法希望完成上述的一項或幾項工作。

在這里還可以再次調用Start(),也就是說可以再次發布異步服務請求。

4、在RunError()中處理錯誤

活動對象完全允許RunL()異常退出,結尾是“L”表明了這一點。如果該函數確實異常退出,則它異常退出時的錯誤碼將被傳遞到RunError()。

TInt CCsvFileLoader::RunError(TInt aError)

{

    iObserver.NotifyLoadCompleted(aError , *this);

    return KErrNone;

}

這里的錯誤處理很簡單,僅僅將錯誤傳遞給了觀察器。

5、刪除未完成的請求

所有的活動對象都必須實現一個DoCancel()方法,用于刪除任何未完成的請求。

void CCsvFileLoader::DoCancel()

{

    if(iWastingTime || !iHaveTriedToLoad)

    {

        iTimeWaster.Cancel();

    }

}

CActive::Cancel調用DoCancel(),絕對不允許重寫CActive::Cancel()自身(它無論如何都不是虛函數),因為該函數完成了大量重要的工作。

1)檢查活動對象是否實際上處于活動狀態。如果不是,它就會返回,而不作任何事情。

2)調用DoCancel()

3)等待請求完成,這必須盡可能完成(原始請求可能在刪除它之前就已經完成)

4iActive設為假

注意:可以重寫DoCancel()方法,但不可以重寫Cancel()方法,這個方法會自動調用DoCancel(),另外,我們也不能直接調用DoCancel()方法,這一點也是很重要的。

6、析構函數

CCsvFileLoader::~CCsvFileLoader()

{

    Cancel();

    iFile.close();

    iTimeWaster.Close();

}

任何活動對象析構函數的第一步都是調用Cancel()刪除任何未完成的請求。如果刪除一個帶有未完成請求的活動對象,則產生一個請求迷失的嚴重錯誤。

必須關閉異步服務提供器的任何句柄,從而避免資源泄漏。

CActive析構函數將自動調用Deque(),從活動規劃器列表中移除活動對象。

7、啟動活動規劃器

UI框架將自動創建、安裝和啟動活動規劃器。因此,如果不打算編寫.exe(控制臺應用程序或Symbian OS服務器)或DLL(需要顯式啟動活動規劃器),則可以省略這些步驟。

啟動活動規劃器前,必須完成如下步驟:

1)實例化活動規劃器

2)將其安裝到線程中

3)創建一個活動對象并添加到活動規劃器中

4)發出一個請求

void DoExampleL()

{

    CActiveScheduler* scheduler = new(ELeave) CActiveScheduler;

    CleanupStack::PushL(scheduler);

    CActiveScheduler::Install(scheduler);

    CElementsEngine* elementEngine = CElementsEngine::NewLC(*console);

    elementEngine->LoadFromCsvFilesL();//發出請求

    CActiveScheduler::Start();//啟動活動規劃器

    CleanupStack::PopAndDestroy(2 , scheduler);

}

 

五、常見的活動對象錯誤:

1、啟動活動對象前忘記調用CActiveScheduler::Add()

2、在發布或重新發布異步請求后沒有調用SetActive()

3、將相同的iStatus同時傳遞給兩個服務提供器(因此在相同的活動對象上有多個未完成的請求)

 

posted on 2008-10-09 20:42 frank.sunny 閱讀(1829) 評論(0)  編輯 收藏 引用 所屬分類: symbian 開發

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲免费视频网站| 国产乱人伦精品一区二区| 国产一区二区高清| 国产精品久久久久久久久动漫| 欧美制服丝袜| a91a精品视频在线观看| 欧美日韩一区精品| 欧美1区2区| 亚洲夜间福利| 日韩一级黄色片| 免费不卡亚洲欧美| 欧美一区二区三区在线视频 | 亚洲欧美在线免费| 蜜臀av在线播放一区二区三区| 午夜精品免费在线| 欧美mv日韩mv国产网站| 久久蜜桃香蕉精品一区二区三区| 亚洲日本一区二区| 欧美日韩高清在线一区| 亚洲激情视频在线| 久久久精品国产一区二区三区| 欧美xx69| 国产精品久久久久久av福利软件 | 国产精品久久久久久久免费软件 | 国语自产偷拍精品视频偷| 亚洲一区二区三区精品在线观看 | 亚洲欧洲一区| 久久精品一区四区| 你懂的国产精品| 欧美成年人网站| 亚洲麻豆一区| 亚洲欧美精品在线| 久久久久这里只有精品| 欧美国产日产韩国视频| 老司机精品视频网站| 欧美日韩一区二区视频在线观看 | 欧美日韩午夜在线| 久久精品123| 欧美精品二区| 国产日韩欧美一区二区| 国产精品久久二区| 欧美亚洲网站| 一区二区三区视频在线观看| 国产欧美亚洲精品| 久久久久综合一区二区三区| 亚洲自拍偷拍色片视频| 老牛影视一区二区三区| 国内视频一区| 午夜在线一区| 久久婷婷麻豆| 欧美日韩精品欧美日韩精品一| 黄色亚洲在线| 亚洲一区久久久| 亚洲人成网在线播放| 久久久精品999| 精品成人一区二区| 久久久噜噜噜久久中文字幕色伊伊 | 国产精品高清在线| 亚洲国产欧洲综合997久久| 亚洲激情在线视频| 亚洲欧美日韩精品久久| 欧美一级视频| 亚洲一区二区在| 亚洲一区二区三区四区视频| 亚洲视频在线免费观看| 欧美成年人视频网站| 亚洲视频图片小说| 欧美在线国产精品| 国产午夜精品全部视频在线播放| 一区电影在线观看| 老司机免费视频一区二区| 亚洲精品国精品久久99热| 国产欧美日本一区二区三区| 亚洲视频在线免费观看| 亚洲美女黄色片| 欧美日韩p片| 正在播放亚洲一区| 在线亚洲精品| 国产日韩久久| 免费不卡在线视频| 牛牛精品成人免费视频| 国产精品99久久不卡二区| 日韩天堂在线视频| 国产日本欧美一区二区三区在线 | 欧美日韩成人一区二区三区| 一本高清dvd不卡在线观看| 亚洲裸体俱乐部裸体舞表演av| 欧美网站在线| 免费成人高清视频| 欧美高清在线| 久久成人综合视频| 欧美成人午夜激情在线| 亚洲伊人网站| 久久久久国产精品人| 亚洲国产精品久久久久| 亚洲美女尤物影院| 激情综合五月天| 亚洲人午夜精品| 国产噜噜噜噜噜久久久久久久久| 久久蜜桃精品| 欧美日韩精品国产| 亚洲一区二区三区精品在线| 亚洲欧美区自拍先锋| 精品成人乱色一区二区| 日韩午夜剧场| 伊人影院久久| 亚洲综合日本| 中文一区二区在线观看| 麻豆精品传媒视频| 小嫩嫩精品导航| 欧美精品久久99久久在免费线| 久久久一区二区三区| 欧美日韩中文精品| 欧美国产综合视频| 国产欧美精品一区| 一区二区不卡在线视频 午夜欧美不卡'| 国内外成人免费视频| 日韩午夜av在线| 亚洲国产日韩欧美| 久久激情久久| 久久国产精品亚洲77777| 欧美日韩18| 亚洲激情欧美| 亚洲激情电影在线| 久久久在线视频| 久热精品视频在线观看| 国产裸体写真av一区二区| 日韩视频免费| av成人激情| 欧美精品一区在线发布| 亚洲国产高清在线| 91久久精品一区| 久久久免费av| 欧美 日韩 国产在线 | 久久久www免费人成黑人精品 | 免费在线观看一区二区| 国产婷婷一区二区| 香蕉久久夜色| 久久精精品视频| 国产日韩欧美精品| 午夜精品久久久久久久99樱桃| 午夜精品久久久久久久久久久久| 欧美午夜精品久久久| 日韩一级片网址| 亚洲视频精选在线| 国产精品久久亚洲7777| 午夜国产不卡在线观看视频| 亚洲女同精品视频| 国产欧美一区二区三区视频| 午夜免费在线观看精品视频| 久久av免费一区| 在线成人av.com| 欧美精品网站| 亚洲午夜免费视频| 久久久久国产精品厨房| 在线观看福利一区| 欧美另类在线播放| 亚洲专区一区| 免费一区二区三区| 在线一区二区三区四区| 国产精品视频一二| 久久在线免费观看视频| 日韩视频一区二区三区在线播放免费观看 | 校园激情久久| 亚洲国产高清高潮精品美女| 亚洲国产精品久久91精品| 国产亚洲欧美日韩在线一区| 久久国产精品99久久久久久老狼| 免费日韩精品中文字幕视频在线| 亚洲经典在线看| 国产精品福利在线观看网址| 午夜精品久久久久久久白皮肤| 蜜臀久久久99精品久久久久久| 亚洲伦理中文字幕| 国产精品视频自拍| 可以看av的网站久久看| 一本色道久久综合亚洲二区三区| 久久精品一区二区国产| 日韩视频国产视频| 国产自产女人91一区在线观看| 欧美精品导航| 久久精品国产99精品国产亚洲性色| 亚洲激情视频在线观看| 久久精品视频免费| 一本久道综合久久精品| 韩国三级电影一区二区| 欧美特黄视频| 欧美a级一区二区| 欧美伊人久久久久久久久影院| 亚洲国产精品热久久| 久久中文字幕一区| 欧美一区二区视频97| 亚洲综合色激情五月| 9色精品在线| 亚洲日本一区二区| 伊人成人网在线看| 国内精品久久久久久久97牛牛| 国产精品多人| 欧美婷婷久久| 欧美日精品一区视频|