我們先看乙個應用程式的入口函式:
gldef_c tint e32main()
可以看到它裝載了清除棧,那麼從現在開始清除棧就可以使用了。接下來它又執行了下面一段**:
if(coe != null)
u 建立active scheduler,將自身作為active object加入到active schelduler
u 建立與window server的連線rwssession
u 建立rwindowgroup,作為應用程式的根視窗
u 建立cwsscreendevice物件
u 建立cwindowgc物件
下面我們一一介紹每一步驟的功能:
1) 建立active scheduler
該函式首先建立了active scheduler,將自身作為active object加入到active schelduler,這樣ceikonenv就可以非同步的負責處理從window server來的標準事件(如鍵盤或是觸控螢幕事件)和重繪事件。但是active scheduler在這裡還沒有被啟動,所以暫時還沒有事件被處理。
2) 建立window server的連線
window server是ui處理的核心元件,它採用的是標準symbianc/s模式,其主要功能有:
a) 處理鍵盤、觸控螢幕事件及視窗繪製事件,並將它發到相應的客戶端的請求**。
b) 負責symbianui的視窗繪製和管理,採用樹形結構。包括視窗的建立,重新整理和銷毀。
c) 提供客戶呼叫api:rwssession,並提供其它相應的外掛程式以方便使用者擴充套件,例如animation、sprites和cursor。
ceikonenv通過定義window server的客戶類的成員變數rwssession來與window server進行通訊。其初始化過程便在這裡執行。
3) 初始化rwindowgroup
rwindwogroup是用來在window server內建立視窗組(window group)的,視窗組是一種特定的不能被顯示的window,它僅作為應用程式的根視窗。且鍵盤和事件的焦點和它聯絡在一起,這樣的話window server就知道已經有乙個應用程式已經和它產生聯絡,需要在適當的時候將按鍵等事件發給應用程式
4) 建立乙個與檔案服務的rfs連線以便於讀取資源檔案。例如,rss檔案。
5) 建立圖形上下文乙個是cwsscreendevice,另乙個是cwindowgc。
window server無法負責具體的應用程式螢幕繪製功能,而是應由應用程式間接的控制window server來繪製圖形。所以這裡有兩個類,作為ceikonenv的成員函式提供給應用程式來完成它的圖形會制功能,乙個是cwsscreendevice,另乙個是cwindowgc。cwsscreendevice實際上是乙個虛擬的螢幕裝置,儲存著螢幕的大小及各種引數。cwindowgc是用來提供視窗繪圖環境,比較常見。具體可以參考symbian sdk。
完成初始化之後,會執行如下函式:
coe->execute();
該函式是這樣的:
trapd(exitcondition, cactivescheduler::start());
這時候active scheduler被啟動了,ceikonenv作為cactive的子類,就不斷的開始響應window server傳來的事件。於是整個應用程式就開始真正的工作了。我們來看看具體的執行過程。
首先,注意到ceikonenv繼承於cactive,自然我們就需要知道runl函式是怎麼工作的,
export_c void ccoeenv::runl()
}那麼handlewseventl中又是如何處理的,我們以keydown事件為例:……}
最後我們還需要知道如何訂閱window server的事件,否則ceikonenv這個active object無法進行非同步呼叫。它是在cactivescheduler裡進行window server事件的訂閱,cone採用的active scheduler不是標準的cactivescheduler,是繼承於cactivescheduler的擴充套件ccoescheduler,它重寫了waitforanyrequest函式:
export_c void ccoescheduler::waitforanyrequest();
可以看到,ccoescheduler的不同之處在於在等待其它執行緒喚醒時,一定要執行icoeenv->readevent()這個函式,它的內部實現是乙個非同步函式,訂閱了來自於window server的事件。這樣有事件從window server過來就會執行ceikonenv的runl函式,執行完當cactivescheduler進行waitforanyrequest等待時,就會再次向window server訂閱事件,so on and so forth。
Symbian應用程式啟動順序
以下為sdk help中所寫的symbian應用程式啟動順序 0 使用者在 launcher 中選擇應用程式的圖示,launcher 以該程式的 檔案的檔名為命令列引數呼叫 1 框架裝入應用程式 dll,e32dll method 被呼叫。2 框架呼叫函式 這裡生成了乙個 類的例項,並返回乙個指向它...
讓Symbian應用程式開機自動啟動
symbian開機自動啟動的問題 一共分為兩大步,每一大步裡又分為幾個小步驟 一 建立boot檔案 1 2 在.pkg檔案目錄下建乙個新檔案,命名為 專案名.boot 3 在新建的 專案名.boot 檔案裡輸入 4 儲存這個檔案 二 編輯.pkg檔案 1 在.pkg檔案的末尾加上 專案名.boot ...
讓Symbian應用程式開機自動啟動
symbian開機自動啟動的問題 一共分為兩大步,每一大步裡又分為幾個小步驟 一 建立boot檔案 1 2 在.pkg檔案目錄下建乙個新檔案,命名為 專案名.boot 3 在新建的 專案名.boot 檔案裡輸入 4 儲存這個檔案 二 編輯.pkg檔案 1 在.pkg檔案的末尾加上 專案名.boot ...