Qt中采用多線程實(shí)現(xiàn)Socket編程
本文介紹的是Qt中采用多線程Socket編程,由于工作的需要,開始接觸Qt的socket編程。Qt里的example是個(gè)不錯(cuò)的教程,但是當(dāng)我把代碼移植到多線程的環(huán)境時(shí)就出問題了:
- QObject: Cannot create children for a parent that is in a different thread.
由于想要在線程中保留一個(gè)socket,以便維持雙邊通信,因此定義如下:
- SocketThread:public QThread
- {
- ....
- private:
- QTcpSocket _tcpSocket;
- }
但是這段代碼并無法正常的完成工作,后來在網(wǎng)上搜了一下資料,找到以下解釋(忘了出處了,以下是中文的大概意思):“ 在QThread中定義的所有東西都屬于創(chuàng)建該QThread的線程。“
問題出來了,如果按照這個(gè)定義,在SocketThread中定義的_tcpSocket,其實(shí)是屬于mainThread(SocketThread是在main函數(shù)中創(chuàng)建),而當(dāng)我們?cè)赟ocketThread中的run函數(shù)使用到_tcpSocket的時(shí)候,其實(shí)是跨線程調(diào)用,這樣就會(huì)出現(xiàn)上面的異常。
解決方法: 需要對(duì)SocketThread的定義做一下更改:
- SocketThread:public QThread
- {
- ....
- private:
- QTcpSocket* _tcpSocket;
- }
在上面我們并沒有創(chuàng)建具體的對(duì)象,而是定義了一個(gè)指針,而如何讓指針內(nèi)的內(nèi)容從屬于SocketThread這個(gè)線程呢?答案就是要在SocketThread的run方法中初始化:
- SocketThread::run()
- ... ;
- _tcpSocket = new QTcpSocket();
進(jìn)行以上修改之后上面的異常就不再出現(xiàn)了。
小結(jié):Qt中采用多線程Socket編程的內(nèi)容介紹完了,在編程過程中我們也不免接觸多線程,相信也有一定的了解,最后希望本文對(duì)你有所了解?。。?/p>