Qt中采用多線程實現Socket編程


Socket通常也稱作"套接字",應用程序通常通過"套接字"向網絡發出請求或者應答網絡請求。

本文介紹的是Qt中采用多線程Socket編程,由於工作的需要,開始接觸Qt的socket編程。Qt里的example是個不錯的教程,但是當我把代碼移植到多線程的環境時就出問題了:

QObject: Cannot create children for a parent that is in a different thread.

由於想要在線程中保留一個socket,以便維持雙邊通信,因此定義如下:

SocketThread:public QThread 

    { 

            .... 

            private: 

                  QTcpSocket _tcpSocket; 

     }

但是這段代碼並無法正常的完成工作,后來在網上搜了一下資料,找到以下解釋:“在QThread中定義的所有東西都屬於創建該QThread的線程。“

問題出來了,如果按照這個定義,在SocketThread中定義的_tcpSocket,其實是屬於mainThread(SocketThread是在main函數中創建),而當我們在SocketThread中的run函數使用到_tcpSocket的時候,其實是跨線程調用,這樣就會出現上面的異常。

解決方法: 需要對SocketThread的定義做一下更改:

SocketThread:public QThread 

    { 

            .... 

            private: 

                  QTcpSocket* _tcpSocket;

     }

在上面我們並沒有創建具體的對象,而是定義了一個指針,而如何讓指針內的內容從屬於SocketThread這個線程呢?答案就是要在SocketThread的run方法中初始化:

SocketThread::run() 

    ... ; 

     _tcpSocket = new QTcpSocket(); 

進行以上修改之后上面的異常就不再出現了。

小結:Qt中采用多線程Socket編程的內容介紹完了,在編程過程中我們也不免接觸多線程,相信也有一定的了解,最后希望本文對你有所了解!

在使用Qt線程時,在線程里跑上一個定時器。定時器時間超限時觸發信號,傳遞給主線程做其他的事情。

繼承QThread后在實現run()函數后,m_pTimer = new QTimer(this);   new一個定時器對象,並傳入this指針---注意此時的this指針是主線程的。但每次創建線程時會出現以下提示:

QObject: Cannot create children for a parent that is in a different thread

傳入this指針------相當於在子線程里為主線程建立了對象,所以出現跨線程警告。

另外QT中繼承Qthread類后,在類中定義的對象或或對象的指針都是屬於主線程的。次線程正真意義上的實體內容實在實現run()函數里。

所以,要將mythread線程里的對象或指針創建,需要在run()函數里,創建或分配對象空間。
---------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM