整理 symbian中活動物件的簡單使用

2021-09-30 05:59:09 字數 2215 閱讀 5900

symbian官方推薦使用活動服務物件(cactive)來代替多執行緒的使用,我想這個道理是很明了的,在手機這樣的小記憶體裝置裡,執行多執行緒的程式是非常耗資源的,為了節約資源,symbian提供了乙個活動服務物件的框架,允許把程式裡併發執行物件(其實不是併發,不過巨集觀上看來是)放在乙個執行緒裡面執行,這些併發工作的物件就通過活動規劃器(activescheduler)來進行管理.

關於這兩個東西的介紹,網上有一大堆的文件,我就不在這裡廢話了,如何使用呢?這裡我先舉乙個簡單的計數器的例子.我選擇寫乙個exe的程式,也就是說程式是以e32main為入口的.

gldef_c tint e32main()

delete cleanup;

return 0; }

以上的內容是每乙個exe檔案都應該做的,ctrapcleanup* cleanup=ctrapcleanup::new()建立乙個清除堆疊,以便程式在異常退出的時候把清除堆疊裡面的資源都釋放掉.當然你也可以加上堆檢測巨集(__uheap_mark,__uheap_markend),這裡我就不多說了。trapd是symbian裡面經常使用的巨集,功能類似於try,第乙個引數是讓定義乙個錯誤返回值變數的名字, 後面就是可能有異常的你寫的函式.當這個函式異常時,程式不會crash, 你可以得到異常的原因.可以參考nokia論壇上的一些關於這些使用的文件.

接下來是vcallinstancel函式,在這個函式裡面我來建立activescheduler.

local_c void callinstancel()

else

cleanupstack::popanddestroy(scheduler); }

這段程式很簡單就是建立乙個活動規劃器,並壓入清除棧,然後安裝活動規劃器,這樣就可以用了.再執行真正的例項函式,最後出棧銷毀。doinstance(該函式將在最後的**中給出,主要的功能就是呼叫我們自己寫的活動計數器)我們放到最後來寫,現在來構造我們的活動計數器物件。

class timecount : public cactive ;

timecount::timecount():cactive(0)  // 這裡可以設定活動物件的優先順序

timecount* timecount::newlc()

void timecount::docancel(void)

void timecount::setdelaytime(int mtime)

timecount::~timecount()

void timecount::startl()

void timecount::constructl()

void timecount::runl()

每乙個活動服務物件都有乙個istatus來標識當前物件的狀態.在這裡我們把istatus設定為itimer.after(istatus, 10000 * 100 * mtime);也就是定時器定時mtime秒鐘以後istatus發生改變,這個時候活動規劃器會收到這個狀態的改變,從而呼叫相應活動物件的處理函式,也就是runl函式.在runl函式裡面進行計數和輸出,然後呼叫startl重新設定定時器和物件狀態,再提交給活動規劃器。這樣mtime秒鐘以後活動規劃器會再次呼叫runl函式.一直這樣重複,這樣就達到了計數器的效果。

最後我們來寫doinstancel函式

local_c void doinstancel()

建立好物件以後,加上cactivescheduler::start()程式就開始執行了,這句話告訴活動規劃器該等待物件的狀態的改變了(正常情況下,一旦cactivescheduler::start()之後,程式直到cactivescheduler::stop()才能終止執行),在這裡就是timecount的istatus的改變.等istatus改變並呼叫了runl以後,繼續等待iststus的改變,這樣我們使用活動物件的計數器就能夠通過訊息驅動執行起來了.

這裡的cactivescheduler只管理了乙個cactive物件,就是timecount,可以用類似的方法實現多個cactive,並且都加入cactivescheduler,cactivescheduler將會等待所有加入它的cactive的狀態的改變,其中有乙個的狀態改變就會去執行對應的活動物件的處理函式,當狀態同時發生的時候,會通過物件的優先順序來決定先呼叫誰的runl函式.cactivescheduler也是非搶占式的,當乙個runl函式還沒有執行完的時候,如果另乙個cactive的狀態改變,會等待runl執行完以後再執行另乙個cactive的處理函式(正因為這一點,所以通常runl函式不能設計為長函式,否則會阻塞活動物件)。

整理 symbian中活動物件的簡單使用

整理 symbian中活動物件的簡單使用 symbian官方推薦使用活動服務物件 cactive 來代替多執行緒的使用,我想這個道理是很明了的,在手機這樣的小記憶體裝置裡,執行多執行緒的程式是非常耗資源的,為了節約資源,symbian提供了乙個活動服務物件的框架,允許把程式裡併發執行物件 其實不是併...

Symbian 中的活動物件和CS框架

所有的active object都繼承於cactive類,cactive有兩個純虛方法需要被實現 runl and docancel 在建構函式中需要給定active object的優先值 提出request的函式有三件事情要做 1.判斷是否有request被提出但是還沒有解決 2.提交reques...

我對Symbian中的活動物件的理解

symbian中的活動物件的存在是由它的系統功能的結構決定的。它的系統功能是由一系列的服務 server 完成的,通過一些定義好的api提供給客戶端 client 也就是我們的程式使用。這些功能實際上並不是在我們的程式的程序是執行的,所以很多的api都有同步 sychronous 和非同步 asyc...