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

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

 

活動對象框架原理

 

一、概述:

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

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

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

注意:

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

2)雖然在一個線程內(nèi)的活動對象是非搶占式地協(xié)同運行的,但在它們所在的線程卻是搶占式調(diào)度的

 

二、概念:

一個活動對象必須派生自基類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 ();//刪除未完成請求的函數(shù)

……

    IMPORT_C void SetPriority (TInt aPriority);

    Inline TBool IsActive () const;

……

protected:

    IMPORT_C CActive (TInt aPriority);

    IMPORT_C void SetActive ();

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

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

    IMPORT_C virtual TInt RunError (TInt aError);

public:

    TrequestStatus iStatus;//代表請求狀態(tài)

……

private:

    TBool iActive;

……

}

通過上面的CActive聲明可以看出:活動對象和線程類似,構(gòu)造時也會有一個優(yōu)先級值來決定它們?nèi)绾伪徽{(diào)度,通常為活動對象提供一個標準優(yōu)先級EPriorityStandard。當活動對象響應的異步服務完成時,就會產(chǎn)生一個事件。活動調(diào)度器會偵測到事件,并決定每個事件對應的是哪個活動對象,然后調(diào)用恰當?shù)幕顒訉ο笕ヌ幚硎录?/span>當活動對象處理事件時,直到事件處理函數(shù)返回到活動調(diào)度器,該對象都是無法被搶占的,也就是說,RunL()事件處理函數(shù)是一個原子操作。

Symbian OS中,活動對象相互協(xié)作并順序的實現(xiàn)多任務,也不需要對共享的資源進行同步保護。另外,因為活動對象在同一個線程中運行,所以可以更容易地共享內(nèi)存和對象,盡管活動對象存在于同一線程,但它們?nèi)匀皇歉髯元毩⑦\行的,這就好像同一個進程中的線程是獨立運行的一樣。

 

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

參照上面CActive的聲明

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

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

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

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

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

 

四、活動對象的實現(xiàn)步驟:

1、構(gòu)造

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

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);

    //活動對象加到活動規(guī)劃器中,這條語句也可以放在第一階段構(gòu)造函數(shù)中

}

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

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

{

    ……

}

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

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

 

2、啟動活動對象

void CCsvFileLoader::Start( )

{

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

    iTimeWaster.After(iStatus , delay);

    SetActive();//iActive設為Etrue

}

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

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

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

3RunL()

這個函數(shù)比較復雜,它將執(zhí)行大量任務:

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

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

3)處理所有加載的數(shù)據(jù)

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

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

4、在RunError()中處理錯誤

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

TInt CCsvFileLoader::RunError(TInt aError)

{

    iObserver.NotifyLoadCompleted(aError , *this);

    return KErrNone;

}

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

5、刪除未完成的請求

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

void CCsvFileLoader::DoCancel()

{

    if(iWastingTime || !iHaveTriedToLoad)

    {

        iTimeWaster.Cancel();

    }

}

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

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

2)調(diào)用DoCancel()

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

4iActive設為假

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

6、析構(gòu)函數(shù)

CCsvFileLoader::~CCsvFileLoader()

{

    Cancel();

    iFile.close();

    iTimeWaster.Close();

}

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

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

CActive析構(gòu)函數(shù)將自動調(diào)用Deque(),從活動規(guī)劃器列表中移除活動對象。

7、啟動活動規(guī)劃器

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

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

1)實例化活動規(guī)劃器

2)將其安裝到線程中

3)創(chuàng)建一個活動對象并添加到活動規(guī)劃器中

4)發(fā)出一個請求

void DoExampleL()

{

    CActiveScheduler* scheduler = new(ELeave) CActiveScheduler;

    CleanupStack::PushL(scheduler);

    CActiveScheduler::Install(scheduler);

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

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

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

    CleanupStack::PopAndDestroy(2 , scheduler);

}

 

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

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

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

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

 

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

常用鏈接

留言簿(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>
            国产精品一二三视频| 久久精品亚洲国产奇米99| 欧美体内she精视频| 欧美日本中文| 欧美日韩国产免费| 欧美午夜精彩| 国产有码一区二区| 亚洲第一页中文字幕| 亚洲精品影院| 亚洲欧美日韩天堂| 开心色5月久久精品| 亚洲福利久久| 亚洲国产日韩欧美在线动漫| 日韩一区二区免费高清| 亚洲综合欧美| 老司机免费视频久久| 欧美日韩一区二区三区四区五区| 国产精品激情偷乱一区二区∴| 国产亚洲欧美日韩美女| 亚洲破处大片| 性做久久久久久免费观看欧美| 久久视频这里只有精品| 亚洲日韩成人| 欧美在线|欧美| 欧美日本韩国在线| 韩国av一区二区| 日韩视频精品在线| 久久久国产精彩视频美女艺术照福利| 欧美成人激情在线| 午夜精品久久久久久久男人的天堂| 久久久久久久一区二区三区| 欧美精品自拍偷拍动漫精品| 国产日产高清欧美一区二区三区| 亚洲国产精品t66y| 欧美一级电影久久| 亚洲韩国青草视频| 欧美专区福利在线| 国产精品国产三级国产aⅴ入口| 国产一区视频网站| 亚洲女爱视频在线| 亚洲国产精品国自产拍av秋霞| 亚洲女女女同性video| 欧美精品三级| 在线观看亚洲视频| 久久精品视频免费| 亚洲亚洲精品三区日韩精品在线视频| 欧美成人a视频| 在线看一区二区| 久久精品卡一| 午夜国产欧美理论在线播放| 欧美日韩国产成人在线免费| 亚洲国产乱码最新视频| 久久精品女人天堂| 欧美亚洲一区三区| 国产日韩欧美亚洲一区| 香蕉成人啪国产精品视频综合网| 亚洲精品免费在线观看| 亚洲欧美国产高清| 亚洲欧美日韩视频二区| 亚洲欧洲精品一区二区精品久久久| 久久久成人网| 国产一区二区无遮挡| 欧美亚洲网站| 亚洲伊人久久综合| 国产精品日本| 亚洲一区在线看| 亚洲图片在线| 国产日韩精品电影| 久久蜜桃精品| 久久午夜精品一区二区| 国产在线精品二区| 久久综合狠狠综合久久综青草 | 日韩天天综合| 亚洲韩国青草视频| 欧美激情亚洲综合一区| 一区二区日韩免费看| 一区二区三区视频在线看| 国产精品大片| 久久久777| 女人天堂亚洲aⅴ在线观看| 亚洲精品看片| av不卡在线看| 国产免费一区二区三区香蕉精| 久久大综合网| 久久亚洲私人国产精品va媚药| 91久久精品www人人做人人爽| 亚洲国产精品一区制服丝袜| 欧美午夜精品久久久久久超碰| 亚洲欧美日本视频在线观看| 欧美一区视频| 亚洲福利国产| 亚洲午夜精品久久| 黄色国产精品| 在线视频你懂得一区| 韩国美女久久| 日韩小视频在线观看专区| 国产视频欧美| 最新日韩在线| 精品成人一区| 亚洲性视频网址| 亚洲精品一区中文| 久久久www| 亚洲欧美中文另类| 欧美激情bt| 久热精品视频在线观看| 欧美色中文字幕| 亚洲国产精品免费| 国产自产女人91一区在线观看| 日韩亚洲视频| 亚洲欧洲久久| 久久在线精品| 久久精品视频在线免费观看| 欧美伦理在线观看| 欧美日韩一区二区免费视频| 久久综合色天天久久综合图片| 亚洲美女在线国产| 欧美一区二区精美| 亚洲图中文字幕| 免费观看成人网| 久久精品国产清高在天天线| 欧美日韩黄视频| 欧美激情黄色片| 国产亚洲精品7777| 亚洲一级网站| 午夜在线视频一区二区区别 | 国产精品国产自产拍高清av王其| 老司机一区二区| 国产日韩欧美综合在线| 亚洲午夜视频在线| 亚洲午夜视频在线观看| 欧美国产一区二区| 欧美搞黄网站| 亚洲国产精品va在线看黑人动漫| 久久99伊人| 久久九九全国免费精品观看| 国产目拍亚洲精品99久久精品| 亚洲精品美女在线观看播放| 亚洲美女一区| 欧美经典一区二区| 亚洲精品一区久久久久久| 亚洲三级网站| 欧美婷婷六月丁香综合色| 亚洲韩国日本中文字幕| 日韩视频在线你懂得| 欧美激情亚洲视频| 一区二区电影免费观看| 一本久久综合| 亚洲激情影视| 夜夜嗨av一区二区三区网站四季av| 欧美激情导航| 在线性视频日韩欧美| 午夜久久tv| 国产午夜精品一区二区三区欧美| 欧美一区二区视频在线观看2020| 久久精品国产综合精品| 国产婷婷色一区二区三区四区 | 欧美激情精品久久久久久变态| 亚洲国产高清自拍| 亚洲视频碰碰| 国产亚洲精品一区二555| 久久精品免费观看| 亚洲国产mv| 亚洲午夜精品久久| 国产一区二区三区无遮挡| 狂野欧美激情性xxxx欧美| 亚洲激情成人在线| 欧美日韩不卡一区| 亚洲自拍另类| 欧美大尺度在线观看| 亚洲自拍三区| **性色生活片久久毛片| 欧美日本国产视频| 欧美在线视频观看| 最近中文字幕日韩精品| 午夜精品一区二区三区电影天堂| 国产一区二区丝袜高跟鞋图片| 欧美不卡视频| 欧美一区二区日韩| 国产精品美女久久| 午夜欧美大尺度福利影院在线看| 欧美日韩精品综合| 久久国产加勒比精品无码| 亚洲国产一二三| 久久久久久69| 亚洲一区bb| 亚洲欧洲一区二区三区在线观看| 国产精品网站在线观看| 免费成人激情视频| 欧美一级播放| 亚洲人在线视频| 欧美jizz19性欧美| 久久国产欧美| 国产精品99久久久久久久女警 | 亚洲——在线| 日韩一区二区精品| 国产一区二区日韩| 欧美午夜精品久久久久久超碰| 美国成人毛片| 久久成人一区| 亚洲欧美美女|