java函数ao活动对象_[AO] AO全面介绍
活動(dòng)對(duì)象:一.同步函數(shù)被調(diào)用時(shí),它會(huì)將服務(wù)執(zhí)行完成,然后才返回到其調(diào)用處。
異步函數(shù)則會(huì)在函數(shù)調(diào)用中提交一個(gè)請求,然后馬上返回到調(diào)用處,但該請求會(huì)遲些才會(huì)完成。在請求完成之前,調(diào)用者可以繼續(xù)執(zhí)行其它的處理,在請求完成時(shí),調(diào)用者會(huì)接受到一個(gè)表明請求成功或失敗的通知信號(hào)。這個(gè)通知信號(hào)就是一個(gè)事件,而這種方式就是事件驅(qū)動(dòng)的。
雖然所有活動(dòng)對(duì)象事件處理(RunL)都是非搶占的,但在多數(shù)情況下,可以在活動(dòng)對(duì)象的事件處理方法(RunL)中嵌入單獨(dú)的活動(dòng)規(guī)劃器,并且使用嵌入的活動(dòng)規(guī)劃器來接受其它活動(dòng)對(duì)象的請求。這對(duì)于”等待”的模式對(duì)話框可能有用,但是,這是有弊端的,所以盡量不要使用。如果一旦使用這種嵌入的活動(dòng)規(guī)劃器,一定要確保CActiveScheduler::Start()方法與CActiveScheduler::Stop()方法嚴(yán)格匹配。
二.大多數(shù)活動(dòng)規(guī)劃器是由框架隱式創(chuàng)建的(例如GUI框架中的CONE),但若是實(shí)現(xiàn)一個(gè)服務(wù)器或基于控制臺(tái)的代碼,就必須在使用活動(dòng)對(duì)象前顯式創(chuàng)建并啟動(dòng)一個(gè)活動(dòng)規(guī)劃器。
在Symbian中有一些線程沒有活動(dòng)規(guī)劃器,因此它們無法直接使用活動(dòng)對(duì)象或那些使用了活動(dòng)對(duì)象的組件:
1.Java的實(shí)現(xiàn)不支持活動(dòng)規(guī)劃器,Java的本地方法不能使用活動(dòng)對(duì)象。但是Java可以在代碼中調(diào)用使用了活動(dòng)對(duì)象的C++服務(wù)器,因?yàn)檫@些服務(wù)器運(yùn)行在單獨(dú)的一個(gè)有活動(dòng)規(guī)劃器的線程。
2.STDLIB,即C標(biāo)準(zhǔn)庫線程是沒有活動(dòng)規(guī)劃器的,因而標(biāo)準(zhǔn)庫代碼是不能使用活動(dòng)對(duì)象的。但標(biāo)準(zhǔn)庫提供的代碼可以被活動(dòng)對(duì)象代碼所使用
3.OPL不支持活動(dòng)規(guī)劃器,并且OPL的C++擴(kuò)展(OPX)也不可以使用活動(dòng)對(duì)象或那些使用了活動(dòng)對(duì)象的組件。
三.CActive通過如下步驟實(shí)現(xiàn)Cancel():
1.檢查iActive,判斷是否存在未完成的請求(至多只能有一個(gè))。如果沒有,則不需要再做什么。
2.調(diào)用DoCancel()使異步服務(wù)提供器停止。
3.調(diào)用User::WaitForRequest(),并指定iStatus。這可以保證立即完成,它會(huì)減少線程信號(hào)量,隨后由活動(dòng)規(guī)劃器調(diào)用的User::WaitForRequest()不會(huì)因?yàn)樵撊∠埱蠖e(cuò)誤地完成。
4.重新設(shè)置iActive為EFalse,至此表明此活動(dòng)對(duì)象未完成的請求已經(jīng)完成。
若某一個(gè)長線任務(wù)可以分割為若干個(gè)小的片段,則強(qiáng)烈建議利用低優(yōu)先級(jí)(比如CActive::TPriority::EPriorityIdle(-100))的活動(dòng)對(duì)象來實(shí)現(xiàn)。否則就只用通過低優(yōu)先級(jí)的后臺(tái)線程來實(shí)現(xiàn)了。
CIdle就是一個(gè)繼承了CActive用來進(jìn)行長線任務(wù)的包裝類。CIdle對(duì)象應(yīng)該在被創(chuàng)建時(shí)賦予一個(gè)低優(yōu)先級(jí)。
CPeriodic類是用于運(yùn)行片段化任務(wù)的另一個(gè)有用的CActive派生類。它使用一個(gè)定時(shí)器對(duì)象來產(chǎn)生規(guī)則的定時(shí)器事件,每當(dāng)發(fā)生定時(shí)器事件,它都處理任務(wù)中的單獨(dú)一步。和CIdle相似,CPeriodic也是由一個(gè)優(yōu)先級(jí)來初始化,并且任務(wù)通過調(diào)用Start()被初始化,傳入的參數(shù)除了執(zhí)行任務(wù)片段的回調(diào)函數(shù)還有一個(gè)定時(shí)器的設(shè)定值。當(dāng)定時(shí)器周期到達(dá)時(shí),CPeriodic對(duì)象產(chǎn)生一個(gè)可以被活動(dòng)規(guī)劃器檢測到的事件,當(dāng)沒有更高優(yōu)先級(jí)的活動(dòng)對(duì)象要進(jìn)行事件處理時(shí),活動(dòng)規(guī)劃器會(huì)調(diào)用CPeriodic對(duì)象的RunL方法,而RunL則按順序調(diào)用完成任務(wù)處理的回調(diào)函數(shù);而如果定時(shí)器發(fā)出周期到達(dá)事件時(shí),其它更高優(yōu)先級(jí)的活動(dòng)對(duì)象也產(chǎn)生了完成事件,那后者將會(huì)被處理;還有一種情況是當(dāng)定時(shí)器在計(jì)時(shí)中,另一個(gè)活動(dòng)對(duì)象產(chǎn)生了完成事件,那么活動(dòng)規(guī)劃器這時(shí)就會(huì)執(zhí)行另一個(gè)活動(dòng)對(duì)象的事件處理方法。
我們可以通過使線程中所有活動(dòng)對(duì)象都只執(zhí)行簡短,高效的RunL方法以及讓CPeriodic對(duì)象具有比其它活動(dòng)對(duì)象更高的優(yōu)先級(jí)來改善信號(hào)的響應(yīng)和回調(diào)處理。
四.當(dāng)活動(dòng)對(duì)象發(fā)出一個(gè)請求時(shí),可以通過以下4種方式完成:
1.由于沒有用于相關(guān)資源的內(nèi)存,或者是存在無效的參數(shù)等原因使請求甚至無法開始執(zhí)行。若發(fā)生這種情況,請求的函數(shù)不應(yīng)該異常退出,也不應(yīng)該返回一個(gè)非零的錯(cuò)誤碼。相反,它應(yīng)該將實(shí)現(xiàn)代碼提交到請求狀態(tài)中,從而該請求將只完成一次。如下圖所示:
總結(jié)
以上是生活随笔為你收集整理的java函数ao活动对象_[AO] AO全面介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做糖耐量喝糖水吐如何防止呕吐?
- 下一篇: java中的左值右值_利用左值右值实现树