基于MiniGUI的多進程圖形用戶界面的研究
0引言
本文引用地址:http://m.butianyuan.cn/article/171429.htm嵌入式圖形用戶界面(Graphic User Interface)是嵌入式產(chǎn)品設計和開發(fā)的重點,隨著嵌入式產(chǎn)品的廣泛應用,所實現(xiàn)的功能也日益強大和復雜,因此對嵌入式產(chǎn)品的GUI在功能、易用性、穩(wěn)定性等方面提出了更高的要求。目前的嵌入式GUI多是基于線程實現(xiàn),在穩(wěn)定性和功能上具有一定的局限性,所以開發(fā)多進程的GUI具有重要意義。
MiniGUI是由飛漫開發(fā)的基于事件驅(qū)動的圖形用戶界面支持系統(tǒng),采用微C/S機制和分層設計模型,利用Unix域套接字實現(xiàn)客戶應用程序和服務器程序之間的交互。早期的MiniGUI采用基于POSIX線程進行消息傳遞和窗口管理的機制,這種實現(xiàn)能夠提供最大程度的數(shù)據(jù)共享,實現(xiàn)多窗口系統(tǒng),但是也造成體系結(jié)構(gòu)上的脆弱,所有的窗口在一個進程或者地址空間中運行,一旦某個線程因為非法的數(shù)據(jù)訪問而導致崩潰或終止運行,整個圖形用戶界面系統(tǒng)都將受到影響。
在Linux系統(tǒng)中,任務是以進程為單位實現(xiàn)的。進程主要提供兩類虛擬化資源:虛擬地址空間和虛擬CPU。前者保證了進程在分配和管理內(nèi)存時就像機器上只有這一個進程。類似的,虛擬CPU也使進程看上去獨占了CPU。 Linux系統(tǒng)為進程提供了安全的運行環(huán)境,保證每個進程的獨立性,一個進程的崩潰不會危及其他進程。因此在多進程模式下,能夠同時運行多個客戶進程,如果某個進程不正常終止,其他的進程不會受到影響,因此實現(xiàn)多進程GUI將極大的提高系統(tǒng)的穩(wěn)定性。
1.2 進程間通信方式的選擇
基于多進程的GUI能夠?qū)崿F(xiàn)多個界面窗口的并發(fā)運行,通過進程間通信(IPC)實現(xiàn)窗口切換。進程間通信有多種形式,如管道、信號、共享內(nèi)存等。
共享內(nèi)存是由內(nèi)核出于在多個進程間交互信息的目的而保留的一塊內(nèi)存空間,多個進程共享該內(nèi)存空間,如果一個進程更新了其中的數(shù)據(jù),其他的進程會立即看到更新,而且共享內(nèi)存也是速度最快的進程間通訊機制。因此共享內(nèi)存作為進程間的通信方式對于多窗口GUI系統(tǒng)的編程實現(xiàn)非常合適。
1.3 基于微C/S機制的多進程模型
對于在微C/S機制上運行的GUI系統(tǒng),在運行過程中只能有一個服務器程序,其余的應用程序均為客戶程序。各客戶應用程序分別運行于各自不同的進程空間中,并且根據(jù)需要在應用程序之間通過進程間通信進行數(shù)據(jù)交換,完成窗口切換等過程。
MiniGUI為了實現(xiàn)客戶端和服務器端之間的通信,定義了一種簡單方便的請求/響應結(jié)構(gòu):客戶程序通過制定的結(jié)構(gòu)將請求發(fā)送到服務器,服務器處理請求并應答。在圖形界面運行后,服務器程序完成Server端連接初始化(ServerStart()),建立服務器端連接套接字Socket,其文件描述符為listenfd,進入到偵聽客戶連接請求狀態(tài),用一個Idlehandler4Server句柄等待接收客戶端的連接請求消息,在接受到來自于客戶端的連接請求消息后進行處理,將客戶應用程序加入到當前活動列表,并將客戶端套接字文件描述符clifd加入到偵聽文件集合中??蛻舳顺绦蛟谕瓿蛇B接初始化后(cli_conn())建立客戶端套接字Socket,并發(fā)送連接請求消息給Server程序,之后采用句柄 IdelHandler4Client偵聽服務器的返回消息。此后服務器程序進入一個消息循環(huán)過程,在此循環(huán)過程中繼續(xù)準備接收已連接的客戶程序的其他消息、新的客戶程序連接請求消息以及由系統(tǒng)產(chǎn)生的鼠標、鍵盤事件消息等,并在事件消息處理完成后用函數(shù)Send2Client將需要的消息發(fā)送到相應的客戶端應用程序。此后客戶端應用程序從套接字讀取由服務器程序處理后返回的消息,并把消息寫到當前進程的桌面隊列中,交由本進程消息循環(huán)進行分發(fā)和處理。在獲得消息處理結(jié)果后用cli_quest()向服務器端發(fā)送數(shù)據(jù)請求,服務器端接收數(shù)據(jù)請求后交由handle_request按照請求功能號的不同調(diào)用不同的服務例程進行處理,完成后發(fā)送一個{HWND_INVALID,0}消息和應答數(shù)據(jù),客戶端接收服務器應答消息,至此完成一個基本的消息循環(huán)通信過程。
基于以上的分析, MiniGUI下的基于微C/S機制的多進程GUI通信模型如圖1所示:
相比傳統(tǒng)的嵌入式圖形界面開發(fā),多進程圖形用戶界面系統(tǒng)在編程實現(xiàn)上有較大的復雜性。圖形用戶界面必須實現(xiàn)對窗口、層、異步事件、光標或者加上觸摸屏的管理,MiniGUI本身的消息機制的管理與內(nèi)核系統(tǒng)的其他機制之間的配合等。
評論