• 沒有找到結果。

事件驅動程式設計 (Event-Driven Programming)

第三章、 CCPK 框架設計

3.2 帄台相依層設計 (Design of Platform Dependent Layer)

3.2.1 事件驅動程式設計 (Event-Driven Programming)

事件驅動程式設計是一種程式設計模式,這種模式的程式,其流 程掌控是透過使用者的動作(如按下按鈕,在觸控螢幕上點擊等)或者 是系統通知程式特定的事件發生,甚或是程式觸發給程式本身來決定 的。相對的另一種程式設計模式則為批次程式設計 (Batch

programming) ,其程式流程掌控則是由程式開發人員所決定。

事件驅動程式設計的崛起是因為互動的操作需求所導致,目前大

相對的比多執行緒的程式單純,因為事件驅動程式設計大多是利用同 一個執行緒去處理不同的事件處理器 (Event handler) ,因此可避 免多執行緒需要額外掌控程式同時讀取資源 (如記憶體,資料庫等) 所發生衝突。而且可以減少除錯時的困難度[7]。

3.2.1.1 事件驅動程式設計模式 (Event-Driven Programming Model)

一個事件驅動程式模式如圖 3-2 所示,當系統收到該程式對應的 事件時,系統會將這些事件依序放在事件佇列中。程式則會有一個函 式迴圈不斷的檢查事件佇列中是否有尚未執行的事件,並且透過分發 器 (Dispatcher) 配對適合的事件處理器,以處理相對的工作。

圖 3-2、事件驅動程式設計模式

3.2.1.2 Windows CE 事件驅動程式設計模式

在 Windows CE 中事件驅動又被稱為訊息驅動 (Message - Driven) 。如圖 3-3 所示,Windows 程式的入口為“WinMain()”,

透過“WndProc()”將對應訊息分配到適當處理函式。當系統將屬於 該程式的訊息放置於訊息佇列中 (Message Queue) ,程式內會有一 個讀取佇列的迴圈不斷去取出佇列並交由分配器處理對應的處理函 式[2]。

圖 3-3、Windows CE 事件驅動程式設計模式

WinMain()主要的功能在於產生一個主要視窗以便接收訊息佇列,

並且執行一迴圈去讀取訊息佇列,其虛擬程式碼如下。

int WINAPI WinMain(HINSTANCE hInstance,…) {

MSG msg;

HWND hWnd = CreateWindow(szWindowClass, …);

ShowWindow(hWnd, …);

// Main message loop:

while (GetMessage(&msg, NULL, 0, 0)) {

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return (int) msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

break; // do something you want when the window just created case WM_PAINT:

3.2.1.3 Symbian 事件驅動程式設計模式

由於在 Symbian[13]系統中,其提供的框架 (Framework) 已經 將底層的細節包裝成物件提供程式開發人員使用,如圖 3-4 所示

圖 3-4、Symbian 事件驅動程式設計模式

事件分配器已經由 Symbian Framework 所負責,因此程式開發人 員可在 Symbian Framwork 所提供的函式中,實作對應的程式碼。關 於更詳細的 Symbian 事件驅動模式,請參照同實驗室學弟高偉傑的論 文[18]。

3.2.1.4 CCPK 事件驅動程式設計模式

式,如圖 3-5 所示,我們利用應用程式模組來處理訊息迴圈,並負責 聯繫其他模組。而利用圖形使用者介面模組做為分配器的角色,使得 特定的事件,例如使用者按下按鍵、在觸控螢幕上點選或者是要求程 式重畫畫面等。另外新增網路模組來處理網路功能,並且設計此網路 模組使用事件驅動的模式 (fnOnRecv()) 來通知程式資料已從網路 另一端接收完成。圖 3-5 中白色的部分即代表程式開發人員僅需在 CCPK Framework 中所提供的虛擬函式 (Virtual Functions) [14],

如 fnOnKey()、fnOnDraw()等中撰寫自己的程式碼即可收到這些系統 的事件,而不需了解各個帄台底層不同的事件驅動模式。

圖 3-5、CCPK 事件驅動程式設計模式

相關文件