- Tilcon圖形界面設計基礎
- 易流平等
- 3914字
- 2020-09-15 16:55:44
2.3.3 信道(TCP/IP與IPC)
1.信道工作機制 信道是兩個進程或線程間通信的載體,由Tilcon內部API進行調用,用于實現應用程序與GUI引擎之間的數據交換,其工作原理如圖2-9所示。每個信道有兩個子端,一個用于發送數據,另一個用于接收數據,基于信道的數據收發連接創建并設置成功后,不帶GUI引擎的應用程序就可以輕易地與另一臺機器上的GUI引擎進行通信。

圖2-9 信道工作原理示意圖
GUI引擎通常只在它所處的一方創建一個信道子端,所有連接到同一信道的應用進程創建并維護著應用方的唯一信道子端。只有在使用TCP/IP進行通信的情況下例外,此時信道的兩個子端都在GUI引擎所在一方創建并維護著,GUI引擎負責識別在指定時間內與之通信的進程。GUI引擎所在方的信道子端支持創建的最大連接數為64。
一個應用程序可以連接各自運行的不同機器上的多個遠程GUI引擎,遠程信道之間通過信道ID和信道名稱進行識別,最大連接數為64。當應用程序調用TRT_StartEx()命令啟動GUI引擎時,GUI引擎給應用程序返回一個cid或信道ID號,開發者可以使用任意命名規則對信道命名(Tilcon模板通常使用TRT_cid)。
2.信道與單線程 單線程應用系統是指應用進程只包含一個執行線程,當應用程序通過TRT_StartEx()調用創建與GUI引擎的通信連接和信道時,不創建額外的線程。例如,在一個單線程應用系統中,一個信道專門用于接收GUI通知,另一個信道專門用于傳遞來自應用程序的數據或命令給GUI。
3.信道與多線程 多線程應用系統是指系統中可以存在一個或多個線程。在多線程應用系統中,必須使用特定的Tilcon多線程支持庫。單線程應用系統中的信道原理同樣適用于多信道應用系統。若應用系統使用TCP/IP進行通信,則必須使用Tilcon TCP/IP多線程支持庫,在創建通信連接和信道時,將新建一個線程用于監測和設置連接超時時間,從而提高應用系統遠程實時連接的靈活性。
4.信道與IPC 以下是Tilcon提供的應用進程或線程之間實現IPC通信的顯式API接口函數,更多關于API接口函數的詳細內容可參考相應的API接口函數。
■ TRT_ChOpen():在當前線程中創建一個信道。
■ TRT_ChClose():異步地關閉當前線程中創建的信道。
■ TRT_ChReceiveX():異步地從參數指定的信道中接收消息。
■ TRT_ChReply():對來自參數指定信道的消息做出回復。
■ TRT_ChConnect():連接參數指定線程中的信道到遠程信道上。
■ TRT_ChDisconnect():斷開當前線程中的信道與遠程信道的連接。
■ TRT_ChGetName():獲取參數指定信道ID對應的信道名稱。
■ TRT_ChSend():異步地向參數指定的信道發送消息并等待回復。
■ TRT_ChTrigger():異步地觸發參數指定的信道。
■ TRT_ChReceive():接收來自當前線程中信道的消息。
■ TRT_ChGetID():獲取參數指定的遠程信道名稱對應的信道ID。
使用IPC進行通信,每個線程必須創建自己的信道子端,線程之間不允許共享信道子端,也就是說執行API命令TRT_xxx()的每個線程都必須執行TRT_StartEx()命令,其返回的cid值也必須是執行其他API命令的cid參數。Tilcon信道機制基于發送/接收/應答模型,同一機器上的線程間通信和不同機器間的TCP/IP通信都是使用本地IPC。這樣,一個線程A創建信道子端后,另一個線程B就可以連接到該信道子端,然后線程A就可以發送TRT_GetInput()命令給線程B,線程B收到后回復線程A請求的數據。
5.信道返回代碼 不同模式下的信道返回代碼見表2-3至表2-6。
表2-3 TRT_GetInput()(TRT_NO_BLOCK模式)命令的返回代碼

表2-4 TRT_GetInput()(TRT_BLOCK模式)命令的返回代碼

表2-5 TRT_ChReceive()(TRT_BLOCK模式)命令的返回代碼

表2-6 TRT_ChReceive()(TRT_NO_BLOCK模式)命令的返回代碼

[注意]信道名稱最大長度為32字節,超過32字節將導致不可預期的返回代碼。
6.信道生命周期 信道的生命周期分為以下三個階段:
連接階段:在兩個信道子端之間建立一個通信連接;
通信階段:在兩個信道子端之間進行消息收發;
終止階段:兩個信道子端之間的通信連接被終止。
7.信道與架構 Tilcon信道的通信架構主要有以下三種:
(1)Tilcon GUI線程與Tilcon內核引擎通信,且兩者在同一機器上。這種情況下,兩個線程通過本地操作系統提供的進程間通信(IPC)進行信息交互。
(2)Tilcon GUI線程與遠程Tilcon內核引擎通信,且兩者在不同一機器上,兩者基于的操作系統也可能不同。這種情況下,兩個線程通過TCP/IP網絡協議棧進行信息交互。此時,Tilcon GUI線程嘗試與遠程的Tilcon內核引擎建立連接,遠程的GUI內核引擎必須處在運行狀態,并在指定的Socket端口上偵聽其他機器的連接請求。
(3)Tilcon GUI線程與本地其他線程通信,且兩者在同一機器上。這種情況下,兩個線程通過Tilcon提供的API接口進行信息交互,其底層依賴的也是本地操作系統提供的進程間通信(IPC)。
不同的通信架構,在信道生命周期的每個階段調用的相關API有所不同,見圖2-10至圖2-12。

圖2-10 同一機器上的GUI線程與Tilcon內核引擎通過本地IPC通信

圖2-11 不同機器上的GUI線程與Tilcon內核引擎通過TCP/IP通信

圖2-12 同一機器上GUI主線程與其他線程通過本地IPC通信
(1)GUI線程與本地的GUI內核引擎通信
連接階段:GUI線程調用TRT_StartEx()接口啟動本地內核引擎,若用戶未通過參數指定等待本地內核引擎響應的超時時間,則使用默認超時等待時間(10秒)。若在10秒內,內核引擎未正常啟動或響應GUI線程,則默認為內核引擎啟動失敗。若內核引擎已經由其他線程啟動,則調用TRT_StartEx()接口不會再次啟動內核引擎。同時,創建一個信道對象,并與內核引擎建立一條通信鏈路。
通信階段:GUI線程調用TRT_GetInput()接口從事件描述數據隊列中獲取下一個TRT_ReceiveData類型的數據,若隊列中無數據,則阻塞等待下一個數據的到來(TRT_BLOCK)或結束GUI線程(TRT_NO_BLOCK)。TRT_GetInput()接口是GUI應用程序與GUI內核引擎通信的主要方式。當發生某個事件時,GUI內核引擎將檢測該事件是否觸發通告消息或回調操作,若觸發通告或回調,則準備并推送一個描述事件信息的TRT_ReceiveData結構體到事件描述數據隊列中。其他線程也可以通過TRT_ChSend()或TRT_ChTrigger()接口發送消息到GUI線程的事件描述數據隊列中。GUI線程調用TRT_SetValues()接口設置GUI界面對象及其組件的屬性值,調用TRT_GetValues()接口獲取GUI界面對象及其組件的屬性值。
結束階段:GUI線程調用TRT_Exit()接口,告知GUI內核引擎退出當前GUI線程,GUI引擎將刪除內存中的所有窗口,并同步告知連接GUI引擎的所有進程,當前GUI線程將退出(code = TRT_window,state = TRT_exit_all)。
(2)GUI線程與遠程GUI內核引擎通信
連接階段:GUI線程調用TRT_StartEx()創建一個信道對象,并建立信道與遠程內核引擎的TCP/IP連接,若用戶未通過參數指定等待遠程內核引擎響應的超時時間,則使用默認超時等待時間(60秒)。若在60秒內,遠程內核引擎未響應GUI線程,則認為與遠程內核引擎的連接創建失敗。TRT_StartEx()接口調用不會啟動遠程主機上的GUI引擎,所以在調用TRT_StartEx()之前,遠程GUI內核引擎必須已經啟動運行,否則TRT_StartEx()調用將失敗。遠程GUI引擎可以通過-t選項進行啟動。
通信階段:GUI線程調用TRT_GetInput()接口從事件描述數據隊列中獲取下一個TRT_ReceiveData類型的數據,若隊列中無數據,則阻塞等待下一個數據的到來(TRT_BLOCK)或結束GUI線程(TRT_NO_BLOCK)。當發生某個事件時,GUI內核引擎將檢測該事件是否觸發通告消息或回調操作,若觸發通告或回調,則準備并推送一個描述事件信息的TRT_ReceiveData結構體到事件描述數據隊列中,其他線程也可以通過TRT_ChSend()或TRT_ChTrigger()接口發送消息到事件描述數據隊列中。調用TRT_SetValues()接口設置GUI界面對象及其組件的屬性值。調用TRT_GetValues()接口獲取GUI界面對象及其組件的屬性值。
結束階段:GUI線程調用TRT_Exit()接口,告知GUI內核引擎退出當前GUI線程,GUI引擎將刪除內存中的所有窗口,并同步告知連接GUI引擎的所有進程,當前GUI線程將退出(code = TRT_window,state = TRT_exit_all)。
(3)GUI線程與本地其他線程的通信
連接階段:GUI線程調用TRT_StartEx()接口啟動本地內核引擎,若用戶未通過參數指定等待內核引擎響應的超時時間,則使用默認超時等待時間(10秒)。若在10秒內,內核引擎未正常啟動或響應GUI線程,則默認為內核引擎啟動失敗。若內核引擎已經由其他線程啟動,則調用TRT_StartEx()接口不會再次啟動內核引擎。同時創建一個信道對象,并建立一條與內核引擎的通信鏈路。其他線程通過TRT_ChOpen()接口創建一個信道,然后通過TRT_Connect()接口與GUI線程的信道建立連接。
通信階段:GUI線程調用TRT_GetInput()接口從事件描述數據隊列中獲取下一個TRT_ReceiveData類型的數據,若隊列中無數據,則阻塞等待下一個數據的到來(TRT_BLOCK)或結束GUI線程(TRT_NO_BLOCK)。當發生某個事件時,GUI內核引擎將檢測該事件是否觸發通告消息或回調操作,若觸發通告或回調,則準備并推送一個描述事件信息的TRT_ReceiveData結構體到事件描述數據隊列中。GUI線程也可以通過TRT_GetInput()接口獲取其他線程發送的消息,通過TRT_Reply()接口回復其他線程由TRT_ChSend()接口發出的消息,通過TRT_ChTrigger()或TRT_ChSend()接口發送消息給其他線程。其他線程通過TRT_ChTrigger()或TRT_ChSend()接口發送消息到GUI線程的事件描述數據隊列中,通過TRT_ChReceive()接口接收GUI線程發送的消息,通過TRT_Reply()接口回復GUI線程由TRT_ChSend()接口發出的消息。
結束階段:GUI線程調用TRT_Exit()接口,告知GUI內核引擎退出當前GUI線程,GUI引擎將刪除內存中的所有窗口,并同步告知連接GUI引擎的所有進程,當前GUI線程將退出(code = TRT_window,state = TRT_exit_all)。其他線程通過TRT_ChDisconnect()接口中斷本線程信道與GUI線程信道的連接,通過TRT_Close() 接口關閉本線程信道。
8.多屏支持 Tilcon對使用X11(VxWorks、Linux等)或WindML(VxWorks)圖形庫的所有平臺都支持多屏顯示。為每個信道配置系統多屏顯示支持,需要進行如下操作:
? 添加顯示器地址到TRT_StartData結構體中
? TRT_Start()接口調用時,在實參中使用掩碼TRT_STARTDATA_DISPLAY指定使用添加到TRT_StartData結構體中的顯示屏,而不是系統默認顯示屏
? 使用關聯的信道連接ID修改顯示屏
(1)添加顯示器地址到TRT_StartData結構體中 添加顯示器地址到TRT_StartData結構體時,對于不同的視窗系統,格式有所不同。
①對于X11平臺,用戶必須提供X-Server的IP地址、顯示器索引值、X-Server索引值3項信息,格式為XServerIP:DisplayID.XServerID。
②對于使用WindML圖形庫的平臺,用戶必須提供唯一的Tilcon應用程序名稱和顯示器索引值,格式為ApplicationName:DisplayID。
以下是在X11多屏顯示平臺上使用遠程主機上某個顯示屏的配置示例。
/* initialize the TRT_StartData structure based on OS */ TRT_StartDataStartData; StartData.Os_Env = TRT_VXWORKS; /*OS*/ /* specify the IP:DISPLAY of the XServer */ StartData.Display = "192.168.129.185:0.0"; StartData.IPAddr = NULL; StartData.AppName = "appName"; StartData.Userprog = "userProg"; StartData.Flags = 0;
若X-Server在本地主機上,IP地址部分可以忽略,Tilcon GUI引擎在X11平臺上默認使用的顯示屏是“:0.0”,在使用WindML圖形庫的平臺上默認使用的顯示屏是“disp0:0”。
(2)指定使用添加到TRT_StartData結構體中的顯示屏 TRT_StartEx()接口函數的定義如下:
int TRT_StartEx ( unsigned long Mask, /*Describes members of TRT_StartData*/ TRT_StartData *pTRT_StartData; /*Contains connection data*/ )
在調用TRT_StartEx()接口時,通過Mask實參值指定使用TRT_StartData結構體中指定的顯示屏,接口調用如下:
TRT_StartEx(TRT_STARTDATA_DISPLAY | TRT_STARTDATA_IPADDR, StartData);
(3)使用關聯的信道連接修改顯示屏 調用TRT_StartEx()接口后,將得到一個信道ID(StartData.CID),該信道ID可用于修改使用的顯示屏。
- 數碼攝影后期零基礎入門教程
- Spring Security 3
- CorelDRAW服裝設計實用教程(第四版)
- Dreamweaver CC實例教程(第5版·微課版)
- Quickstart Apache Axis2
- Photoshop+CorelDRAW平面設計實例教程(第4版)
- After Effects CS6入門與提高
- 中文版3ds Max 2021完全自學教程
- NetLogo多主體建模入門
- AutoCAD 2024建筑設計從入門到精通(升級版)
- Photoshop電商設計與產品精修實戰(微視頻版)
- 中文版Photoshop平面設計入門教程
- Joomla! 1.5 JavaScript jQuery
- Photoshop CC中文版基礎教程
- 從零開始:Dreamweaver CS6中文版基礎培訓教程