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

隨筆 - 2, 文章 - 73, 評論 - 60, 引用 - 0
數據加載中……

[轉載]Active Scheduler & Active Object,活動規劃器和活動對象

活動規劃器 (Active Scheduler)

由于使用多線程來處理異步請求比較消耗系統資源,所以symbian 使用了活動對象(Active Object)來解決異步請求的問題。
活動規劃器(active scheduler)用于處理由活動對象提出的異步請求。它檢測活動對象提出的異步請求,并安排活動對象的請求完成事件的執行順序。活動規劃器僅用一個事件處理線程來規劃各個活動對象提出的事件請求,所以它要比多線程實現異步請求占用更少的資源。
一個活動規劃器通常對應到一個線程,CActiveScheduler 類的靜態方法通常都是針對當前線程中對象的操作。
在程序中使用活動對象時,首先應該創建一個活動規劃器對象,并把它安裝到當前線程,也就是把活動規劃器和當前線程關聯。 CActiveScheduler::Install()方法可以把活動規劃器安裝到當前線程, CActiveScheduler::Current() 方法可以獲取和當前線程關聯的活動規劃器。如:

CActiveScheduler::Install(CAtv)
CActiveScheduler* sco2 =CActiveScheduler::Current();

Add()方法可以把活動對象添加到活動規劃器中,這樣活動規劃器就可以處理活動對象所提出的異步請求,當異步請求完成事件發生時調用活動對象的RunL()方法。
活動規劃器的 Add() 方法把指定的活動對象添加到當前的活動規劃器中。但是在某些時候可能需要刪除在活動規劃器中的活動對象:如果活動對象被銷毀,那么同時活動對象就在活動規劃器中被刪除了,另外使用活動規劃器的Deque()方法也可以把活動對象從活動規劃器中刪除。
在調用Add()方法之前必須確認活動規劃器已經安裝到當前線程,否則將發生E32USER-CBase 44 panic。Add()方法包括一個CActive型的參數, 這是一個指向活動對象的指針,在調用Add()方法時,這個指針不可以為 NULL,否則函數發生 E32USER-CBase 48 panic。另外與要注意的是,在使用Add()方法之前確認活動對象是否已經添加到活動規劃器中,如果這個對象已經添加到活動規劃器中那么將發生E32USER-CBase 41 panic。
CActiveScheduler::Start()方法啟動一個在當前活動規劃器控制下的的循環等待。而CActiveScheduler::Stop()則可以終止活動規劃器的循環等待。活動規劃器實際上是構建了一個事件處理的框架,它在循環中使用User::WaitForAnyRequest()等待活動對象的異步請求,當請求事件完成時,就調用一該請求事件相關的活動對象的RunL()方法。活動對象調用RunL()時把它放在TRAP下,這樣即使RunL()函數發生Leave活動對象也有可以對它處理,執行一些必要的內存清理。當RunL()發生異常退出之后,首先進入活動對象的RunError()方法,這個方法是一個需方法,有一個默認實現,并返回一個整型的值,如果返回的整形值不是KEeeNone,那么活動規劃器將調用自己的Error()方法。Error()方法也有一個默認的實現:發生一個E32USER-CBase 47 panic。

活動對象(Active Object)

CActive類是活動對象(Active Object)的核心類,所有的活動對象類應該從這個類繼承。在CActive 中,封裝了兩個功能:一個是向異步服務提供者發出異步請求;另外一個是處理請完成事件。一個應用程序中可以包含若干個活動對象,并且是它們的都在活動規劃器(active scheduler)的控制下運行。
活動對象應該包括一個和請求函數相關連的請求對象,請求函數是專門用于完成異步請求的,由于帶有請求函數的對象提供了異步服務,所以在SDK的文檔里又把他們叫做異步服務提供者(asynchronous service provider)。這里可以舉一個簡單的例子,RTimer中包括了一些請求函數,如After()、At()等。所以RTimer型的對象是一個異步服務提供者。所以在活動對象中,通常會有一個服務提供者成員,它的作用是提出一個異步請求,并異步完成他們的請求。
活動對象的 RunL() 方法用于處理活動對象的請求完成事件。活動對象類作為CActive類的派生類,它必須實現RunL()方法。如果有業務邏輯需要,RunL()可以發出另外一個新的異步請求。當請求結束事件發生時,這個函數被活動規劃器調用,也就是說,在活動規劃器的WaitForAnyRequest()函數結束以后RunL()函數被調用。WaitForAnyRequest()實際上是對User::WaitForAnyRequest()的調用。
在調用活動對象的RunL方法前,活動規劃器需要確定,哪一個活動對象擁有最高優先權,然后標記該對象的請求作為請求完成事件。這個優先權是在活動對象構造的時候指定的。RunL運行在活動規劃器所設定的TRAP中,如果RunL在執行過程中發生leave那么,那么活動規劃器將調用RunError()方法。一旦調用了活動規劃器的 Start方法,那么所有的用戶代碼將運行在活動規劃器的某個活動對象的RunL()函數或RunError函數下。
活動對象 RunError() 方法用于處理請求結完成事件處理函數RunL() 的異常退出(Leave)。如果活動對象的RunL()函數發生Leave,那么活動規劃器將調用活動對象的RunError方法。這樣這個發生錯誤的活動對象就可以完成一些必要的內存清理。如果有派生類實現了這個方法,那么就應該對可能的 leave 做出處理,并返回KErrNone;如果返回了其他的錯誤碼,那么CActiveScheduler類的Error()將被調用。
RunError() 方法的默認實現返回一個異常退出碼,而一旦發生leave這個異常退出碼是一個非KErrNone的值,這樣可以認為:一般情況下,活動對象的RunL()方法如果發生leave,那么CActiveScheduler類的Error()將被調用。
注意:如果活動對象用于錯誤處理,那么在他的派生類中應該提供一個比較好的CActiveScheduler Error函數,以便處理那些錯誤。
活動對象的SetActive()方法用于向活動規劃器提交一個異步請求。派生類應該在請求發出以后調用這個方法。活動對象也可以通過一定的方法來取消請求,但是這里需要說明的是,取消請求只是讓請求提前完成。關于異步請求取消可以使用Cancel()方法。

請求狀態(TRequestStatus)

服務提供者為了完成服務,需要有一個如何完成服務的信息。TRequestStatus 類的對象用于存放為服務提供者定制的請求完成狀態。當線程提出請求時,例如RTimer 的After()請求,請求狀態對象被作為參數傳遞到請求函數中。服務完成以后,服務提供者發送信號給服務請求對象的請求信號量并在請求對象中保存一個完成碼,通常這個完成碼的值是KErrNone或者是其他系統定義的錯誤碼。TRequestStatus 類是密封類,不再被繼承。

活動規劃器和活動對象協同工作

這里的代碼和附件中的例子一致,可以下載例子直接在VC6++中調試。活動規劃器和活動對象的的協同工作過程如下。首先應該創建一個與當前線程相關的活動規劃器:

CATV* sco = new(ELeave) CATV();
// 推入清理棧
CleanupStack::PushL(sco);
// 把 sco 活動規劃器安裝為當前線程的活動對象
// 安裝以后,sco 活動對象專門處理當前線程的請求事件
CActiveScheduler::Install(sco);

接著創建一個活動對象,TmCount類是一個從CActive類派生的活動對象類。

TmCount* timeCount = TmCount::NewLC();

然后可以從NewLC()方法中看到活動對象構造的具體細節:

TmCount* TmCount::NewLC()
{
console->Printf(_L("NewLC\n"));
// 使用 C++默認構造函數構造
TmCount* result = new (ELeave) TmCount();
// 把活動對象推入清理粘
CleanupStack::PushL( result );
// 調用兩階段構造函數,構造活動對象內部成員
result->ConstructL();
// 返回活動對象指針
return result;
};

在這個默認的構造函數中,還調用了默認的C++構造函數,這個比較關鍵,因為正是在這個構造函數中,把活動對象添加到了活動對象,在這個;函數中,還可以定義活動對象的優先權限:

TmCount::TmCount():CActive(0) // 這里可以設置活動對象的優先級
{
// 把自己加入活動規劃器
iTimeCounter=1;
CActiveScheduler::Add(this);

};

在ConstructL()中,則獲得了一個記時器句柄
void TmCount::ConstructL()
{
// 初始化計數器和定時器
iTimeCounter = 0;
User::LeaveIfError(iTimer.CreateLocal());
console->Printf(_L("ConstructL\n"));
};

這樣,活動對象構造完成。接著,程序調用活動對象的請求函數。

timeCount->StartL(1);

在活動對象的請求函數中:

// 活動對象的請求函數
void TmCount::StartL(TInt mT)
{
// 將請求傳遞給異步服務提供者,
// 異步服務提供者,調用請求函數,
// 這里需要注意iStatus 這個參數,它是一個請求狀態對象。
// 設定定時器狀態為每隔mTime秒鐘狀態完成一次
iTimer.After(iStatus, 10000 * 100 * mT);
// 在調用異步請求函數之后調用SteActive()方法,提交異步請求
SetActive();
};

異步服務提供者處理請求,當請求處理完成以后,它生成一個事件。活動規劃器不斷的檢查是否有請求完成(是否有請求完成事件發生),如果有請求完成,那么調用與該請求相關聯的活動對象的RunL()方法:

void TmCountTwo::RunL()
{
// 計數器+1以后繼續提交延時請求事件
console->Printf(_L("[2]The Count is ->>%d\n"), iTimeCounter++);
// 再次提出異步請求
StartL(1);
};

在這個方法中又提出了一次異步請求,并使計數器值增加。如果條件符合則可以不再讓活動對象提出異步請求,這是一個修改后的RunL():

void TmCount::RunL()
{
// 計數器+1以后繼續提交延時請求事件
console->Printf(_L("[1]The Count is ->>%d\n"), iTimeCounter++);
// 當記數器值大于等于10時,不再提出異步請求。
if (iTimeCounter<10)
{
StartL(1);
}
else
{
//取消請求
Cancel();
}
//User::Leave(9);
};

如果RunL()在運行過程中發生錯誤,則RunError()被調用,以下是RunEror()方法:

TInt TmCount::RunError(TInt aError)
{
console->Printf(_L("[1]Error\n"));
//console->Getch();
return 7;
};

如果RunError()方法返回了一個非KErrNone的值那么活動規劃器的Error方法將被調用。
class CATV :public CActiveScheduler
{
public :
IMPORT_C void Error(TInt anError) const;

};

void CATV::Error(TInt anError) const
{
console->Printf(_L("Error:%d\n"),anError);
//CATV::Stop();
};

posted on 2007-10-12 18:43 郭天文 閱讀(896) 評論(0)  編輯 收藏 引用 所屬分類: S60

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美中文在线免费| 欧美日韩激情网| 国产欧美综合一区二区三区| 亚洲视频在线观看三级| 亚洲精品久久久久久久久久久久| 欧美刺激午夜性久久久久久久| 91久久午夜| 夜夜嗨av一区二区三区免费区| 国产精品jvid在线观看蜜臀 | 欧美大片专区| 99国产精品久久久| 一区二区三区日韩欧美| 国产精品一区=区| 久久夜色精品国产欧美乱极品| 久久亚洲国产精品日日av夜夜| 亚洲人久久久| 亚洲性色视频| 亚洲高清色综合| 在线一区二区日韩| 国产综合欧美在线看| 欧美成人午夜激情在线| 欧美午夜剧场| 蜜乳av另类精品一区二区| 欧美片网站免费| 久久久999精品视频| 欧美成人在线影院| 久久激情婷婷| 欧美激情日韩| 久久免费视频网| 欧美屁股在线| 美女网站在线免费欧美精品| 欧美日韩在线视频观看| 狂野欧美一区| 国产精品v片在线观看不卡| 媚黑女一区二区| 国产精品久久久一区二区三区| 欧美成人a∨高清免费观看| 国产精品国产三级国产专播品爱网| 久久久青草婷婷精品综合日韩| 欧美激情一区二区三区在线视频观看 | 国产精品激情电影| 你懂的视频欧美| 国产精品久久久久久久午夜| 欧美韩日一区二区| 国产一区二区中文字幕免费看| 亚洲精品免费一二三区| 黄色一区二区三区| 亚洲一区二区久久| 99re6这里只有精品视频在线观看| 性欧美长视频| 亚洲欧美日韩天堂一区二区| 欧美精品粉嫩高潮一区二区 | 亚洲精品黄网在线观看| 狠狠色综合网| 小嫩嫩精品导航| 亚洲欧美亚洲| 欧美网站在线| 99re成人精品视频| 一区二区电影免费观看| 欧美国产日韩一区| 欧美激情一区在线| 亚洲国产精品激情在线观看| 久久精品免费| 另类成人小视频在线| 国内精品久久久久久久果冻传媒| 亚洲女人av| 欧美一区二区在线免费播放| 国产精品美腿一区在线看| 亚洲人成毛片在线播放| 99视频在线观看一区三区| 欧美成人综合在线| 亚洲国产日韩一区二区| 亚洲精品视频在线看| 欧美极品在线播放| 亚洲免费电影在线| 亚洲一区在线播放| 国产精品播放| 香蕉尹人综合在线观看| 久久久91精品国产| 雨宫琴音一区二区在线| 老司机精品久久| 91久久精品国产91久久| 一本色道久久88综合日韩精品| 欧美人与禽猛交乱配| 日韩写真视频在线观看| 欧美影院视频| 在线精品一区| 欧美日韩极品在线观看一区| 亚洲在线免费观看| 久久综合图片| 一区二区三区高清不卡| 国产精品综合视频| 久热国产精品| 亚洲午夜精品久久久久久浪潮| 欧美影院久久久| 亚洲国产精品传媒在线观看| 欧美日韩在线免费视频| 欧美一区影院| 亚洲精品欧美一区二区三区| 欧美在线日韩精品| 亚洲国产精品久久久久| 国产精品扒开腿做爽爽爽视频| 欧美在线播放| 亚洲精品资源美女情侣酒店| 久久精品人人做人人综合| 亚洲美女视频在线免费观看| 国产精品久久久久99| 免费欧美日韩国产三级电影| 亚洲一区日韩在线| 亚洲福利在线视频| 久久精品国产91精品亚洲| 亚洲美女黄色片| 国产一二三精品| 欧美日韩伦理在线免费| 久久综合给合久久狠狠色| 亚洲午夜国产一区99re久久| 亚洲电影免费观看高清完整版在线 | 亚洲高清免费| 国产欧美日韩专区发布| 欧美极品色图| 久久天天躁夜夜躁狠狠躁2022| 亚洲一区二区三区午夜| 亚洲精品日韩综合观看成人91| 久久五月天婷婷| 午夜一区二区三区不卡视频| 一本色道久久综合亚洲91| 在线欧美三区| 精品不卡一区二区三区| 国产女人水真多18毛片18精品视频| 欧美日本国产精品| 欧美成人高清视频| 久久综合久久美利坚合众国| 亚洲欧美日韩直播| 国产精品99久久久久久久女警 | 麻豆91精品| 欧美综合77777色婷婷| 亚洲一二三区在线| 亚洲日本欧美天堂| 亚洲国产老妈| 亚洲国产日韩欧美综合久久| 激情综合电影网| 精品51国产黑色丝袜高跟鞋| 国内一区二区三区| 狠狠色丁香婷综合久久| 好看的亚洲午夜视频在线| 国产午夜亚洲精品羞羞网站 | 久久精品成人一区二区三区蜜臀 | 亚洲国产一二三| 亚洲第一中文字幕| 亚洲高清视频中文字幕| 亚洲国产激情| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲国产精品欧美一二99| 欧美激情精品久久久久久免费印度 | 亚洲国产另类久久精品| 欧美福利在线| 亚洲国产精品va在线观看黑人| 亚洲国产精品久久| 日韩午夜一区| 亚洲专区一区二区三区| 欧美在线综合| 久久一区视频| 欧美日韩一视频区二区| 国产精品免费网站在线观看| 国产亚洲成精品久久| 伊人久久大香线| 99v久久综合狠狠综合久久| 中国av一区| 久久九九精品| 欧美国产日产韩国视频| 亚洲精品资源| 欧美在线地址| 欧美激情一区二区三区全黄| 国产精品久久久久久超碰| 国产一二三精品| 日韩视频一区二区三区在线播放免费观看| 日韩视频永久免费| 亚洲欧美日韩综合一区| 蜜桃av噜噜一区| 一本色道久久综合亚洲精品高清| 亚洲欧美视频在线观看| 欧美.www| 国产无遮挡一区二区三区毛片日本| 有码中文亚洲精品| 亚洲免费中文字幕| 欧美成人精品一区| 亚洲一二三四久久| 欧美jizzhd精品欧美巨大免费| 欧美午夜精品久久久久久久| 在线观看日韩欧美| 亚洲欧美日韩直播| 欧美国产精品人人做人人爱| 亚洲一区二区三区高清| 欧美成人精品福利| 国产一区二区三区电影在线观看| 亚洲精品视频二区| 久久中文字幕导航| 午夜激情综合网| 欧美日韩激情小视频| 亚洲国产精品成人va在线观看|