?

通過QT實現進程間的通信

2019-09-07 08:00王惠軍
山西電子技術 2019年4期
關鍵詞:進程消息界面

王惠軍

(山西大眾電子信息產業集團有限公司,山西 太原 030024)

0 引言

Qt是一個1991年由Qt Company開發的跨平臺C++圖形用戶界面應用程序開發框架。它既可以開發GUI程序,也可用于開發非GUI程序,比如控制臺工具和服務器。QT支持Windows、Unix、Android、iOS等多種操作系統,具有優良的跨平臺特性。Qt具有良好封裝機制,使得Qt的模塊化程度非常高,可重用性較好,各個元件之間的協同工作變得十分簡單。QT還包含豐富的API,包括多達250個以上的C++類,還提供基于模板的Date/Time、Serialization、File、Collections、I/O device、Directory management類?;谝陨螿t的眾多優點,使用QT開發程序會更加的方便、高效、簡單。下邊就介紹如何在Windows操作系統下,通過QT實現進程間的通信。

1 環境的搭建

首先介紹QT的開發和運行環境。操作系統選擇Win7 64位,QT版本為5.0.2,C編譯器版本:VS2010,調試工具為Windbg,設置好的系統環境變量包含C:QtQt5.0.2·.0.2msvc2010_openglin、C:WindowsSystem32、C:Program Files (x86)Microsoft Visual Studio 10.0VCin、C:Program Files (x86)Microsoft Visual Studio 10.0Common7IDE。

2 設計思路

基于QT開發程序,可通過消息隊列、信號、共享內存、套接字等方法實現進程間的數據通信。本文主要介紹如何通過套接字和共享內存相結合的方法實現進程間的通信。

設計思路如圖1所示。建立兩個應用程序,在程序中分別開辟相同的共享內存,建立套接字,共享內存用來保存數據,套接字用來發送和接收數據已更改的消息。在第一個程序中輸入數據,數據變化后,修改共享內存中內容,同時向第二個程序發送數據已更改的消息,第二個程序收到數據已更改的消息后,在共享內存中讀取最新的數據,并顯示在界面上。

圖1 設計思路

3 實現

3.1 T1的實現方法

首先介紹第一個程序(T1)的實現方法。

1) 在QT Creator中新建Qt Gui應用程序,在名稱編輯框中輸入T1,其它默認。

2) 添加輸入界面。在界面中添加“LineEdit”控件,添加槽textEditChange(),用來接收輸入變化的消息。

3) 修改頭文件。添加的內容見表1。

表1 頭文件mainwindow.h

第1行和第2行分別包含了頭文件“QSharedMemory”、“QtNetwork/QUdpSocket”,其中加載QSharedMemory表示可調用共享內存的函數,加載QtNetwork/QUdpSocket表示可調用套接字的函數。

第5行到第7行定義了與共享內存有關的變量和函數。

第8行到10行定義了與套接字有關的變量和函數。

第12行定義了槽,用來接收數據變化的消息。

4) 修改CPP文件。在mainwindow.cpp中,需要對CreateShareMem函數、initSocket函數、TextEditChanged函數進行修改。

修改結果見表2。

第1行為共享內存指針分配了地址;第2行設置了共享內存的關鍵字;第3行將共享內存與本程序解綁,保證其它進程也可訪問該共享內存;第4行設置共享內存的大小。

第5行用來創建套接字,給套接字指針分配地址;第6行用來綁定IP地址和端口號,綁定的IP地址是本機地址,端口號是7755。

第7行和第8行用來判斷共享內存指針是否與本進程綁定;第9行將共享內存的數據鎖定;第10行得到共享內存的大??;第11行得到界面中輸入的數據;第12行得到界面輸入數據的長度;第13行將共享內存的大小與數據長度進行比較,保證寫到共享內存中的數據不會溢出;第14行將界面中的數據復制到共享內存中;第15行將共享內存的數據解鎖,保證其它進程可以讀取共享內存中的數據;第16行調用發送套接字消息的函數,將數據已更改的消息發送到第二個程序。

表2 修改結果

經過以上過程,第一個程序就完成了,接下來介紹第二個程序(T2)的實現方法。

3.2 T2的實現方法

T2項目的創建方法與T1項目的創建類似,在名稱編輯框中輸入T2,其它設置與T1項目一致。

1) 添加輸入界面。在界面中添加“LineEdit”控件,添加信號signal_TextChanged(QString)。在信號和槽編輯器中添加連接,發送者是MainWindow,信號是signal_TextChanged(QString),接收者是LineEdit,槽是SetText(QString)。

2) 修改頭文件。T2項目的頭文件與表1的內容類似。

3) 修改CPP文件。在mainwindow.cpp中,需要對CreateShareMem函數、initSocket函數、readPendingDatagrams函數進行修改,其中CreateShareMem函數與T1項目的內容完全一致,initSocket函數中,綁定的端口號為7756,同時添加信號連接,用來響應套接字收到數據的消息。

修改結果見表3。

表3 readPendingDatagrams函數修改結果

第1行到第5行定義了函數中需要用到的變量,包括套接字的數據、地址、端口號,共享內存的數據;第6行判斷套接字是否收到數據;第7行通過套接字指針讀取收到的消息,同時返回消息的內容、長度、IP地址和端口號;第8行到第13行表示從共享內存中讀取數據,與表7中第1行到第9行的含義一致;第14行將最新的數據通過信號發送給LineEdit控件。

經過以上過程,第二個程序就完成了。

3.3 結果顯示

分別對兩個程序進行編譯,編譯成功后運行T1.exe和T2.exe,在T1中輸入信息后,T2會同步進行顯示,如圖2所示。

圖2 運行結果

4 結束語

本文通過一個簡單的例子實現了進程間數據的通信,通過套接字與共享內存結合的方式,可實現不同進程間數據的實時同步,通過改變套接字的消息類型,可實現不同種類數據的同步,在工程應用中有重要的意義。

猜你喜歡
進程消息界面
國企黨委前置研究的“四個界面”
一種可用于潮濕界面碳纖維加固配套用底膠的研究
一張圖看5G消息
債券市場對外開放的進程與展望
改革開放進程中的國際收支統計
基于FANUC PICTURE的虛擬軸坐標顯示界面開發方法研究
電子顯微打開材料界面世界之門
消息
消息
消息
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合