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