国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Qt的智能終端服務(wù)器及其在造紙工業(yè)中的應(yīng)用

2014-08-15 00:42張?zhí)煊?/span>
天津造紙 2014年3期
關(guān)鍵詞:服務(wù)端監(jiān)聽線程

張?zhí)煊?/p>

(天津環(huán)球磁卡股份有限公司,天津,300202)

1 Qt

1.1 Qt是什么

[1]Qt是一個(gè)1991年由奇趣科技開發(fā)的跨平臺(tái)C++圖形用戶界面應(yīng)用程序開發(fā)框架。它既可以開發(fā)GUI程序,也可用于開發(fā)非GUI程序,比如控制臺(tái)工具和服務(wù)器。Qt是面向?qū)ο蟮目蚣?,使用特殊的代碼生成擴(kuò)展 (稱為元對(duì)象編譯器 (Meta Object Compiler,moc))以及一些宏,易于擴(kuò)展,允許組件編程。2008年,奇趣科技被諾基亞公司收購,QT也因此成為諾基亞旗下的編程語言工具。2012年,Qt被Digia收購。

1.2 Qt平臺(tái)支持

● MS/Windows-95、98、NT4.0、ME、2000、XP、Vista、Win7、win8、win2008。

● Unix/X11-Linux、SunSolaris、HP-UX、CompaqTru64 UNIX、IBMAIX、SGI IRIX、FreeBSD、BSD/OS 和其它很多X11平臺(tái)。

●Macintosh-Mac OS X。

●Embedded-有幀緩沖 (framebuffer)支持的嵌入式Linux平臺(tái),Windows CE。

1.3 Qt Creator

Qt Creator是Qt開發(fā)跨平臺(tái) IDE,Qt Creator和Qt共同構(gòu)成的Qt SDK,包含了開發(fā)跨平臺(tái)應(yīng)用程序所需的全部功能。

Qt Creator是一個(gè)用于Qt開發(fā)的輕量級(jí)跨平臺(tái)集成開發(fā)環(huán)境。Qt Creator可提供首個(gè)專為支持跨平臺(tái)開發(fā)而設(shè)計(jì)的集成開發(fā)環(huán)境(IDE)。

Qt Creator包含了一套用于創(chuàng)建和測(cè)試基于Qt應(yīng)用程序的高效工具,包括:

一個(gè)高級(jí)的C++代碼編輯器,上下文感知幫助系統(tǒng),可視化調(diào)試器,源代碼管理,項(xiàng)目和構(gòu)建管理工具。

Qt Creator在LGPL2.1版本授權(quán)下有效,并且接受代碼貢獻(xiàn)。

Qt Linguist被稱為Qt語言家。它的主要任務(wù)只是讀取翻譯文件、為翻譯人員提供友好的翻譯界面,它是用于界面國際化的重要工具。

Linguist工具從4.5開始可以支持Gettext的PO文件格式。

Qt的良好封裝機(jī)制使得 Qt的模塊化程度非常高,可重用性較好,對(duì)于用戶開發(fā)來說是非常方便的。 Qt提供了一種稱為 signals/slots的安全類型來替代callback,這使得各個(gè)元件之間的協(xié)同工作變得十分簡單。

Qt包括多達(dá) 250個(gè)以上的C++類,還提供基于模板的 collections,serialization, file,I/O device,directory management,date/time類。甚至還包括正則表達(dá)式的處理功能。

支持 2D/3D圖形渲染,支持 OpenGL,支持XML。

2 多線程

2.1 概念

[2]在一個(gè)程序中,這些獨(dú)立運(yùn)行的程序片段叫作“線程”(Thread),利用它編程的概念就叫作“多線程處理”。

每個(gè)正在系統(tǒng)上運(yùn)行的程序都是一個(gè)進(jìn)程。每個(gè)進(jìn)程包含一到多個(gè)線程。進(jìn)程也可能是整個(gè)程序或者是部分程序的動(dòng)態(tài)執(zhí)行。線程是一組指令的集合,或者是程序的特殊段,它可以在程序里獨(dú)立執(zhí)行。也可以把它理解為代碼運(yùn)行的上下文。所以線程基本上是輕量級(jí)的進(jìn)程,它負(fù)責(zé)在單個(gè)程序里執(zhí)行多任務(wù)。通常由操作系統(tǒng)負(fù)責(zé)多個(gè)線程的調(diào)度和執(zhí)行。

線程是程序中一個(gè)單一的順序控制流程。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。

線程和進(jìn)程的區(qū)別在于,子進(jìn)程和父進(jìn)程有不同的代碼和數(shù)據(jù)空間,而多個(gè)線程則共享數(shù)據(jù)空間,每個(gè)線程有自己的執(zhí)行堆棧和程序計(jì)數(shù)器為其執(zhí)行上下文。多線程主要是為了節(jié)約CPU時(shí)間,發(fā)揮利用,根據(jù)具體情況而定。線程的運(yùn)行中需要使用計(jì)算機(jī)的內(nèi)存資源和CPU。

2.2 優(yōu)點(diǎn)

●使用線程可以把占據(jù)時(shí)間長的程序中的任務(wù)放到后臺(tái)去處理。

●程序的運(yùn)行速度可能加快。

●在一些等待的任務(wù)實(shí)現(xiàn)上如用戶輸入、文件讀寫和網(wǎng)絡(luò)收發(fā)數(shù)據(jù)等,線程就比較有用了。在這種情況下可以釋放一些珍貴的資源如內(nèi)存占用等等。

2.3 缺點(diǎn)

●如果有大量的線程,會(huì)影響性能,因?yàn)椴僮飨到y(tǒng)需要在它們之間切換。

●更多的線程需要更多的內(nèi)存空間。

●線程可能會(huì)給程序帶來更多“bug”,因此要小心使用。

●線程的中止需要考慮其對(duì)程序運(yùn)行的影響。

●通常塊模型數(shù)據(jù)是在多個(gè)線程間共享的,需要防止線程死鎖情況的發(fā)生。

2.4 Qt多線程

傳統(tǒng)的圖形用戶界面應(yīng)用程序都只有一個(gè)執(zhí)行線程,并且一次只執(zhí)行一個(gè)操作。如果用戶從用戶界面中調(diào)用一個(gè)比較耗時(shí)的操作,那么當(dāng)執(zhí)行這個(gè)操作時(shí),雖然實(shí)際上該操作正在進(jìn)行,但用戶界面通常會(huì)凍結(jié)而不再響應(yīng),多線程正是一種解決方案。

在多線程應(yīng)用程序中,圖形用戶界面運(yùn)行于它自己的線程中,而另外的事件處理過程則會(huì)發(fā)生在一個(gè)或多個(gè)其他線程中。這樣做之后,即使在處理那些數(shù)據(jù)密集的事件時(shí),應(yīng)用程序也能對(duì)用戶界面保持響應(yīng)。當(dāng)在一個(gè)處理器上運(yùn)行時(shí),多線程應(yīng)用程序可能會(huì)比實(shí)現(xiàn)同樣功能的單線程應(yīng)用程序運(yùn)行得更慢一些,無法體現(xiàn)出其優(yōu)勢(shì)。但在目前多處理器系統(tǒng)越來越普及的情況下,多線程應(yīng)用程序可以在不同的處理器中同時(shí)執(zhí)行多個(gè)線程,從而獲得更好的總體性能。

QThread提供了與平臺(tái)無關(guān)的線程。一個(gè)QThread代表單獨(dú)運(yùn)行于程序的線程。在QT中使用多線程,建立一個(gè)類(Thread)繼承QThread類即可。QThread類也有一個(gè)虛函數(shù),這個(gè)函數(shù)是run(),線程建立并啟動(dòng)(QThread::start())后,就會(huì)執(zhí)行這里面的代碼,因此,線程的邏輯過程就應(yīng)該在run()里面定義。

例如:

1.//mythread.h

2.#ifndef MYTHREAD_H

3.#define MYTHREAD_H

4.#include

5.class MyThread:public QThread

6.{

7.public:

8.MyThread();

9.MyThread(int count);

10.void run();

11.private:

12.int count;

13.};

14.#endif//MYTHREAD_H

1.//mythread.cpp

2.#include?“mythread.h”

3.#include“QThread”

4.#include

5.MyThread::MyThread()

6.{

7.}

8.MyThread::MyThread(int count)

9.{

10.this->count=count;

11.}

12.void MyThread::run()

13.{

14.while(count<20000)

15.{

16.qDebug()<

17.}

18.}

1.//main.cpp

2.#include

3.#include?“mythread.h”

4.#include

5.int main(int argc,char*argv[])

6.{

7.QCoreApplication a(argc,argv);

8.qDebug()<<“Main Start”;

9.MyThread myThread1(0);

10.myThread1.setObjectName(“MyThread1”);

11.myThread1.start();

12.MyThread myThread2(0);

13.myThread2.setObjectName(“MyThread2”);

14.myThread2.start();

15.int c=0;

16.while(c<20000)

17.{

18.qDebug()<<“Main Thread”<

19.}

20.return a.exec();

21.}

在main函數(shù)中我定義了兩個(gè)線程,并分別設(shè)置了線程名稱。運(yùn)行過程中有三個(gè)線程會(huì)可能同時(shí)運(yùn)行。主函數(shù)線程,myThread1線程,myThread2線程。

我們可以通過調(diào)用 QObject::moveToThread()來改變QObject對(duì)象和線程之前的關(guān)系,它會(huì)改變對(duì)象本身以及它的孩子與線程之前的關(guān)系。由于QObject不是線程安全的,所以我們必須在它所在的線程中使用;也就是說,你僅僅可以在他們所處的線程中把它移動(dòng)到另一個(gè)線程去,而不能從其他線程中把它從所在的線程中移動(dòng)過來。而且,Qt要求一個(gè)QObject對(duì)象的孩子必須和他的父親在同一個(gè)線程中,也就是說:如果一個(gè)對(duì)象有父親,那么不能使用 QObject::moveToThread()把它移動(dòng)到其他線程;不能在QThread?類中以QThread為父親創(chuàng)建對(duì)象。

面對(duì)多線程一個(gè)好的辦法是:把“工作”部分從“控制”部分分離出來,創(chuàng)建QObject子類對(duì)象,然后使用 QObject::moveToThread()來改 變 對(duì) 象 所 在 的 線程。

例如:

22.class Worker:public QObject

23.{

24.Q_OBJECT

25.

26.public slots:

27.void doWork(){

28./*...*/

29.}

30.};

31.

32./*...*/

33.QThread*thread=new QThread;

34.Worker*worker=new Worker;

35.connect(obj,SIGNAL(workReady()),worker,SLOT(doWork()));

36.worker->moveToThread(thread);

37.thread->start();

這是Qt4.7及以后版本推薦的工作方式。其主要特點(diǎn)就是利用Qt的事件驅(qū)動(dòng)特性,將需要在次線程中處理的業(yè)務(wù)放在獨(dú)立的模塊(類)中,由主線程創(chuàng)建完該對(duì)象后,將其移交給指定的線程,且可以將多個(gè)類似的對(duì)象移交給同一個(gè)線程。

2.5 應(yīng)該做&不應(yīng)該做

可以…

●在QThread子類中添加信號(hào)。這是很安全的,而且可以“正確工作”(前面提到;發(fā)送者所在線程是無關(guān)緊要的)

不應(yīng)該…

●使用moveToThread(this)

●強(qiáng)制連接類型:這通常說明你在做一些錯(cuò)誤的事情,例如混合了QThread控制接口和程序邏輯(它應(yīng)該在該線程創(chuàng)建的對(duì)象中)

●在QThread子類中增加槽函數(shù):它們會(huì)在 “錯(cuò)誤的”線程中被調(diào)用,不是在QThread管理的線程中,而是在QThread對(duì)象創(chuàng)建的線程,迫使你使用direct connection或使用moveToThread(this)函數(shù)

● 使用 QThread::terminate 函數(shù)

禁止…

●在線程還在運(yùn)行時(shí)退出程序。應(yīng)使用 QThread::wait等待線程終止

●當(dāng)QThread管理的線程還在運(yùn)行時(shí),刪除QTread對(duì)象。如果你想要“自動(dòng)析構(gòu)”,你可以將finished()信號(hào)連接到deleteLater()槽函數(shù)上

3 TCP網(wǎng)絡(luò)通訊

3.1 概念

[3]Transmission Control Protocol傳輸控制協(xié)議TCP是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的傳輸層(Transport layer)通信協(xié)議,由 IETF的RFC 793說明(specified)。TCP在IP報(bào)文的協(xié)議號(hào)是6。在簡化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能,UDP是同一層內(nèi)另一個(gè)重要的傳輸協(xié)議。

3.2 Qt—tcp

[4]Qt提供了QTcpSocket類,它將實(shí)現(xiàn)TCP傳輸協(xié)議。TCP是一個(gè)可靠的面向連接的協(xié)議,它按照網(wǎng)絡(luò)節(jié)點(diǎn)間的數(shù)據(jù)流形式進(jìn)行操作。這個(gè)協(xié)議可以用于創(chuàng)建網(wǎng)絡(luò)客戶端和服務(wù)器應(yīng)用程序。若要?jiǎng)?chuàng)建服務(wù)器應(yīng)用程序,還需要QTcpServer類來處理引用的TCP連接。

對(duì)于服務(wù)器來說,多線程的這個(gè)特性太有用了,因?yàn)槎嗑€程使得服務(wù)器可能同時(shí)響應(yīng)多個(gè)客戶端的請(qǐng)求,所以現(xiàn)在服務(wù)器大多采用多線程。

不管是多線程,還是服務(wù)器,QT中已經(jīng)封裝好了特定的類,所以使用起來也很方便。下面建立一個(gè)支持多線程、TCP的服務(wù)器。

首先建立一個(gè)服務(wù)器。新建一個(gè)類(Server)繼承QT中的QTcpServer類即可。服務(wù)器的職責(zé)是監(jiān)聽端口。當(dāng)監(jiān)聽到有客戶端試圖與服務(wù)器建立連接的時(shí)候,分配socket與客戶端連接,再進(jìn)行數(shù)據(jù)通信。QTcpServer的listen()方法執(zhí)行監(jiān)聽過程,可以指定監(jiān)聽的地址和端口。若給定了QHostAddress類型的監(jiān)聽地址,則監(jiān)聽該地址,否則,監(jiān)聽所有地址;若給定了quint16類型的監(jiān)聽端口,則監(jiān)聽該端口,否則,隨機(jī)選定一個(gè)監(jiān)聽端口。

例如:

if(!tcpServer.listen(QHostAddress::Any,9999)){

QMessageBox::critical(this,tr("Fortune Server"),

tr("Unable to start the server:%1.")

.arg(tcpServer.errorString()));

close();

return;

}

QString ipAddress;

QList

for(int i=0;i

if(ipAddressesList.at(i)!=QHostAddress::LocalHost&&

ipAddressesList.at(i).toIPv4Address()){

ipAddress=ipAddressesList.at(i).toString();

break;

}

}

if(ipAddress.isEmpty())

{

ipAddress=QHostAddress(QHostAddress::LocalHost).toString();

}

QTcpServer有一個(gè)虛函數(shù)incomingConnection(int socketDescriptor),服務(wù)器每當(dāng)監(jiān)聽到一個(gè)客戶端試圖建立連接的時(shí)候,會(huì)自動(dòng)調(diào)用這個(gè)函數(shù),因此,處理這個(gè)請(qǐng)求的過程就可以在這個(gè)函數(shù)中,即在子類Server的定義階段,重新定義incomingConnection(int socketDescriptor)這個(gè)函數(shù)。

對(duì)于一個(gè)多線程的服務(wù)器,每當(dāng)客戶端試圖連接的時(shí)候,服務(wù)器應(yīng)該啟動(dòng)一個(gè)線程,負(fù)責(zé)對(duì)這個(gè)客戶端進(jìn)行服務(wù),所以,incomingConnection()這個(gè)函數(shù)所要做的就是建立一個(gè)線程,而所建立的線程的作用就是對(duì)客戶端進(jìn)行服務(wù),而這其中建立socket連接是基礎(chǔ)。服務(wù)器在監(jiān)聽到客戶端試圖建立socket連接時(shí),會(huì)為此socket分配一個(gè)唯一的標(biāo)識(shí)socket-Descriptor,這個(gè)標(biāo)識(shí)將在服務(wù)器端建立socket連接時(shí)使用,所以應(yīng)提供給每一個(gè)線程。QTcpServer只負(fù)責(zé)監(jiān)聽,不會(huì)通訊。當(dāng)它發(fā)現(xiàn)有連接請(qǐng)求時(shí),他會(huì)給出一個(gè)socketDescriptor,只要用這個(gè)描述符創(chuàng)建一個(gè)socket就會(huì)連接到對(duì)方。

例如:

QThread*thread=new QThread();

readMes*readthread=new readMes(socketDescriptor);

readthread->moveToThread(thread);

thread->start();

m_tcpClient=new QTcpSocket();

m_tcpClient->setSocketDescriptor(m_socketDescriptor);

/

***********************************************************************/

void readMes::recevieData()

{

qDebug()<

quint16 i,iSize,iRecLen;

QString tmp;

QDataStream in(m_tcpClient);

in.setVersion(QDataStream::Qt_4_0);

if(m_tcpClient->bytesAvailable()<(int)sizeof(quint16))return;

in>>iSize;

if(m_tcpClient->bytesAvailable()

m_baRecData.clear();

m_recStr.clear();

in>>m_iRecCmd;

in>>m_iRecFactor;

in>>m_iRecLen;

in>>m_recStr;

if(m_iRecLen!=iRecLen){

qDebug()<

return;

}

tcpRecFinished(m_iRecCmd);

}

/

***********************************************************************/

void readMes::sendDatatoClient(quint16 test1,quint16 test2,quint16 test3,QByteArray &data,quint8 chk)

{

QByteArray block;

QDataStream out(&block,QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_0);

out<<(quint16)0;

out<<(quint16)test1;//test1

out<<(quint16)test2;//test2

out<<(quint16)test3;//test3

out<

out<<(qint8)chk;

out.device()->seek(0);

out<< (quint16)(block.size ()-sizeof(quint16));

m_tcpClient->write(block);

m_tcpClient->flush();

}

/

***********************************************************************/

void readMes::sendStringtoClient(quint16 test1,quint16 test2,quint16 test3,QStringList¶)

{

QByteArray block;

QDataStream out(&block,QIODevice::WriteOnly);

out.setVersion(QDataStream::Qt_4_0);

out<<(quint16)0;

out<<(quint16)test1;//test1

out<<(quint16)test2; //test2

out<<(quint16)test3;//test3

for(int i=0;i

out<

out.device()->seek(0);

out<< (quint16)(block.size()-sizeof(quint16));

m_tcpClient->write(block);

m_tcpClient->flush();

}

/

**********************************************************************/

可以通過QDataStream向socket中讀取,寫入數(shù)據(jù),達(dá)到客戶端和服務(wù)端通訊的目的。為了保證在客戶端能接收到完整的文件,在數(shù)據(jù)流的最開始寫入完整文件的大小信息,這樣客戶端就可以根據(jù)大小信息來判斷是否接收到了完整的文件。同理,客戶端向服務(wù)端發(fā)送數(shù)據(jù)時(shí)也要包含文件大小信息,便于服務(wù)器進(jìn)行讀取。

3.3 界面

每一臺(tái)機(jī)器與服務(wù)器建立連接,就會(huì)在服務(wù)器的界面上增加一條記錄??梢酝ㄟ^勾選,對(duì)任意一臺(tái)機(jī)器的文件選擇上傳/下載。原理是:通過TCP服務(wù)器,向客戶端發(fā)送控制命令,客戶端根據(jù)收到的控制命令,啟動(dòng)一個(gè)FTP服務(wù),進(jìn)而通過FTP進(jìn)行文件的上傳下載。

對(duì)于造紙工業(yè)而言,我們可以將各個(gè)部分的機(jī)器的狀態(tài),如:電壓、電流、溫度、濕度等,實(shí)時(shí)的上傳到服務(wù)器上,服務(wù)器可以直觀的將這些數(shù)據(jù)顯示出來,我們也可以利用這些數(shù)據(jù)對(duì)當(dāng)前設(shè)備生產(chǎn)狀況進(jìn)行分析,通過服務(wù)端更改設(shè)置,將數(shù)據(jù)傳輸?shù)侥骋辉O(shè)備,進(jìn)而控制該設(shè)備,如:升溫、降溫。體現(xiàn)了友好的人機(jī)對(duì)話。我們可以通過電腦,掌握所有設(shè)備的實(shí)時(shí)動(dòng)態(tài),進(jìn)而控制設(shè)備,大大提升了工作效率,而且降低了設(shè)備的故障率。通過對(duì)數(shù)據(jù)進(jìn)行更進(jìn)一步的分析,結(jié)合產(chǎn)量,我們可以得出當(dāng)設(shè)備工作在哪種狀態(tài)下,它的效率是最高的。通過對(duì)工藝參數(shù)的更改,進(jìn)一步提升產(chǎn)品質(zhì)量。

3.4 心跳機(jī)制

判斷對(duì)方(設(shè)備,進(jìn)程或其它網(wǎng)元)是否正常動(dòng)行,一般采用定時(shí)發(fā)送簡單的通訊包,如果在指定時(shí)間段內(nèi)未收到對(duì)方響應(yīng),則判斷對(duì)方已經(jīng)當(dāng)?shù)?。用于檢測(cè)TCP的異常斷開。

這里采用的思路是:客戶端連接上服務(wù)端以后,服務(wù)端維護(hù)一個(gè)計(jì)數(shù)器,客戶端每隔一段時(shí)間,向服務(wù)器發(fā)送一個(gè)心跳包,服務(wù)器接收到包以后,計(jì)數(shù)器的值都會(huì)更新為0;一旦服務(wù)端超過規(guī)定時(shí)間沒有接收到客戶端發(fā)來的包,計(jì)數(shù)器的值將會(huì)加1,當(dāng)計(jì)數(shù)器的值累計(jì)大于等于3,則視為掉線。

例如:

maxHeart=0;

heartBeatNum=0;

timer=new QTimer(this);

connect(timer,SIGNAL(timeout()),this,SLOT(receiveHeartBeat()));

timer->start(5000);

timer2=new QTimer(this);

connect(timer2,SIGNAL(timeout()),this,SLOT(heartBeatTest()));

timer2->start(1000);

void readMes::receiveHeartBeat()

{

if(heartBeatNum>5)

maxHeart++;

if(maxHeart>=3)

{

timer->stop();

timer2->stop();

//

emit clientMiss(m_socketDescriptor);

clientMissSLOT();

}

}

void readMes::heartBeatTest()

{

heartBeatNum++;

qDebug()<

}

4 結(jié)語

對(duì)于服務(wù)器來說,多線程的這個(gè)特性太有用了,因?yàn)槎嗑€程使得服務(wù)器可以同時(shí)響應(yīng)多個(gè)客戶端的請(qǐng)求,所以現(xiàn)在服務(wù)器大多采用多線程。程序運(yùn)行效率的提高,也進(jìn)一步優(yōu)化了用戶體驗(yàn)。應(yīng)用于造紙行業(yè),實(shí)現(xiàn)了生產(chǎn)過程及生產(chǎn)信息的系統(tǒng)集成、共享、監(jiān)控,提高了公司的生產(chǎn)管理水平;實(shí)時(shí)監(jiān)測(cè)工藝參數(shù)判定信息,加強(qiáng)了質(zhì)量監(jiān)管,實(shí)現(xiàn)了全程質(zhì)量管理;對(duì)關(guān)鍵生產(chǎn)工藝過程參數(shù)的監(jiān)控和干預(yù),改善和提升產(chǎn)品質(zhì)量;對(duì)關(guān)鍵設(shè)備運(yùn)行狀態(tài)的監(jiān)控和分析,降低設(shè)備事故、提升設(shè)備產(chǎn)能??梢灶A(yù)料,將計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)和現(xiàn)代控制理論應(yīng)用于造紙工業(yè),將對(duì)造紙行業(yè)的發(fā)展起到巨大的推動(dòng)作用。

[1]Stanley B.Lippman,Josee Lajoie,Barbara E.Moo.C++Primer[M].北京:人民郵電出版社,2006.

[2]孫鑫,余安萍.VC++深入詳解 [M].北京:電子工業(yè)出版社,2006.

[3]Jasmin Blanchette,MarkSummerfield.C++GUI Programming with Qt 4[M].Prentice Hall,2006.

[4](美)史蒂文斯(W.RichardStevens) 著,范建華等譯.TCP/IP詳解[M].機(jī)械工業(yè)出版社,2008.

猜你喜歡
服務(wù)端監(jiān)聽線程
基于C#線程實(shí)驗(yàn)探究
英國風(fēng)真無線監(jiān)聽耳機(jī)新貴 Cambridge Audio(劍橋)Melomania Touch
千元監(jiān)聽風(fēng)格Hi-Fi箱新選擇 Summer audio A-401
基于國產(chǎn)化環(huán)境的線程池模型研究與實(shí)現(xiàn)
線程池調(diào)度對(duì)服務(wù)器性能影響的研究*
新時(shí)期《移動(dòng)Web服務(wù)端開發(fā)》課程教學(xué)改革的研究
網(wǎng)絡(luò)監(jiān)聽的防范措施
應(yīng)召反潛時(shí)無人機(jī)監(jiān)聽航路的規(guī)劃
摸清黑客套路防范木馬侵入
Java的多線程技術(shù)探討