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

Socket一般也稱做"套接字",應用程序一般經過"套接字"向網絡發出請求或者應答網絡請求。編程

本文介紹的是Qt中採用多線程Socket編程,因爲工做的須要,開始接觸Qt的socket編程。Qt裏的example是個不錯的教程,可是當我把代碼移植到多線程的環境時就出問題了:網絡

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

因爲想要在線程中保留一個socket,以便維持雙邊通訊,所以定義以下:socket

SocketThread:public QThread tcp

    { 函數

            .... this

            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()函數裏,建立或分配對象空間。---------------------

相關文章
相關標籤/搜索