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