• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    通過(guò)QT實(shí)現(xiàn)進(jìn)程間的通信

    2019-09-07 08:00:34王惠軍
    山西電子技術(shù) 2019年4期
    關(guān)鍵詞:行將共享內(nèi)存端口號(hào)

    王惠軍

    (山西大眾電子信息產(chǎn)業(yè)集團(tuán)有限公司,山西 太原 030024)

    0 引言

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

    1 環(huán)境的搭建

    首先介紹QT的開(kāi)發(fā)和運(yùn)行環(huán)境。操作系統(tǒng)選擇Win7 64位,QT版本為5.0.2,C編譯器版本:VS2010,調(diào)試工具為Windbg,設(shè)置好的系統(tǒng)環(huán)境變量包含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 設(shè)計(jì)思路

    基于QT開(kāi)發(fā)程序,可通過(guò)消息隊(duì)列、信號(hào)、共享內(nèi)存、套接字等方法實(shí)現(xiàn)進(jìn)程間的數(shù)據(jù)通信。本文主要介紹如何通過(guò)套接字和共享內(nèi)存相結(jié)合的方法實(shí)現(xiàn)進(jìn)程間的通信。

    設(shè)計(jì)思路如圖1所示。建立兩個(gè)應(yīng)用程序,在程序中分別開(kāi)辟相同的共享內(nèi)存,建立套接字,共享內(nèi)存用來(lái)保存數(shù)據(jù),套接字用來(lái)發(fā)送和接收數(shù)據(jù)已更改的消息。在第一個(gè)程序中輸入數(shù)據(jù),數(shù)據(jù)變化后,修改共享內(nèi)存中內(nèi)容,同時(shí)向第二個(gè)程序發(fā)送數(shù)據(jù)已更改的消息,第二個(gè)程序收到數(shù)據(jù)已更改的消息后,在共享內(nèi)存中讀取最新的數(shù)據(jù),并顯示在界面上。

    圖1 設(shè)計(jì)思路

    3 實(shí)現(xiàn)

    3.1 T1的實(shí)現(xiàn)方法

    首先介紹第一個(gè)程序(T1)的實(shí)現(xiàn)方法。

    1) 在QT Creator中新建Qt Gui應(yīng)用程序,在名稱(chēng)編輯框中輸入T1,其它默認(rèn)。

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

    3) 修改頭文件。添加的內(nèi)容見(jiàn)表1。

    表1 頭文件mainwindow.h

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

    第5行到第7行定義了與共享內(nèi)存有關(guān)的變量和函數(shù)。

    第8行到10行定義了與套接字有關(guān)的變量和函數(shù)。

    第12行定義了槽,用來(lái)接收數(shù)據(jù)變化的消息。

    4) 修改CPP文件。在mainwindow.cpp中,需要對(duì)CreateShareMem函數(shù)、initSocket函數(shù)、TextEditChanged函數(shù)進(jìn)行修改。

    修改結(jié)果見(jiàn)表2。

    第1行為共享內(nèi)存指針?lè)峙淞说刂?;?行設(shè)置了共享內(nèi)存的關(guān)鍵字;第3行將共享內(nèi)存與本程序解綁,保證其它進(jìn)程也可訪問(wèn)該共享內(nèi)存;第4行設(shè)置共享內(nèi)存的大小。

    第5行用來(lái)創(chuàng)建套接字,給套接字指針?lè)峙涞刂?;?行用來(lái)綁定IP地址和端口號(hào),綁定的IP地址是本機(jī)地址,端口號(hào)是7755。

    第7行和第8行用來(lái)判斷共享內(nèi)存指針是否與本進(jìn)程綁定;第9行將共享內(nèi)存的數(shù)據(jù)鎖定;第10行得到共享內(nèi)存的大??;第11行得到界面中輸入的數(shù)據(jù);第12行得到界面輸入數(shù)據(jù)的長(zhǎng)度;第13行將共享內(nèi)存的大小與數(shù)據(jù)長(zhǎng)度進(jìn)行比較,保證寫(xiě)到共享內(nèi)存中的數(shù)據(jù)不會(huì)溢出;第14行將界面中的數(shù)據(jù)復(fù)制到共享內(nèi)存中;第15行將共享內(nèi)存的數(shù)據(jù)解鎖,保證其它進(jìn)程可以讀取共享內(nèi)存中的數(shù)據(jù);第16行調(diào)用發(fā)送套接字消息的函數(shù),將數(shù)據(jù)已更改的消息發(fā)送到第二個(gè)程序。

    表2 修改結(jié)果

    經(jīng)過(guò)以上過(guò)程,第一個(gè)程序就完成了,接下來(lái)介紹第二個(gè)程序(T2)的實(shí)現(xiàn)方法。

    3.2 T2的實(shí)現(xiàn)方法

    T2項(xiàng)目的創(chuàng)建方法與T1項(xiàng)目的創(chuàng)建類(lèi)似,在名稱(chēng)編輯框中輸入T2,其它設(shè)置與T1項(xiàng)目一致。

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

    2) 修改頭文件。T2項(xiàng)目的頭文件與表1的內(nèi)容類(lèi)似。

    3) 修改CPP文件。在mainwindow.cpp中,需要對(duì)CreateShareMem函數(shù)、initSocket函數(shù)、readPendingDatagrams函數(shù)進(jìn)行修改,其中CreateShareMem函數(shù)與T1項(xiàng)目的內(nèi)容完全一致,initSocket函數(shù)中,綁定的端口號(hào)為7756,同時(shí)添加信號(hào)連接,用來(lái)響應(yīng)套接字收到數(shù)據(jù)的消息。

    修改結(jié)果見(jiàn)表3。

    表3 readPendingDatagrams函數(shù)修改結(jié)果

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

    經(jīng)過(guò)以上過(guò)程,第二個(gè)程序就完成了。

    3.3 結(jié)果顯示

    分別對(duì)兩個(gè)程序進(jìn)行編譯,編譯成功后運(yùn)行T1.exe和T2.exe,在T1中輸入信息后,T2會(huì)同步進(jìn)行顯示,如圖2所示。

    圖2 運(yùn)行結(jié)果

    4 結(jié)束語(yǔ)

    本文通過(guò)一個(gè)簡(jiǎn)單的例子實(shí)現(xiàn)了進(jìn)程間數(shù)據(jù)的通信,通過(guò)套接字與共享內(nèi)存結(jié)合的方式,可實(shí)現(xiàn)不同進(jìn)程間數(shù)據(jù)的實(shí)時(shí)同步,通過(guò)改變套接字的消息類(lèi)型,可實(shí)現(xiàn)不同種類(lèi)數(shù)據(jù)的同步,在工程應(yīng)用中有重要的意義。

    猜你喜歡
    行將共享內(nèi)存端口號(hào)
    跨越2022本刊推出年度新聞大盤(pán)點(diǎn)
    展望2022:e起向未來(lái)
    更 正
    在Docker容器中安裝應(yīng)用程序
    路雖遠(yuǎn),行將必志
    一種基于Tilcon的維護(hù)界面設(shè)計(jì)
    基于PCI總線的多處理器協(xié)同機(jī)制研究
    淺談以java為基礎(chǔ)的Socket通信簡(jiǎn)介及實(shí)現(xiàn)
    青春歲月(2017年5期)2017-04-20 18:34:23
    Winsock編程在《計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)》教學(xué)中的應(yīng)用
    基于Android系統(tǒng)的互動(dòng)展示APP的研究與設(shè)計(jì)
    深泽县| 嘉鱼县| 井陉县| 泽州县| 沽源县| 星座| 石柱| 增城市| 元朗区| 瑞昌市| 江西省| 万山特区| 鄂伦春自治旗| 金川县| 枣庄市| 乐清市| 泽库县| 刚察县| 腾冲县| 德州市| 本溪| 盱眙县| 广宁县| 北海市| 班戈县| 扶风县| 祁东县| 台北县| 桦甸市| 内江市| 泊头市| 岑巩县| 紫阳县| 土默特左旗| 庆云县| 固原市| 南江县| 兰溪市| 讷河市| 黔南| 天全县|