2010-04-23 20 views

回答

-2

這裏是例子:

文件thread.h:

class Thread : public QThread { 
    Q_OBJECT 
public: 
    Thread(); 
protected: 
    void run(); 
} 

文件thread.cpp:

Thread::Thread() {} 
void Thread::run() { 
    // do what ever you want with QTcpSocket 
} 

。 CPP或其他:

Thread *myThread = new Thread; 
connect(myThread, SIGNAL(finished()), this, SLOT(on_myThread_finished())); 
myThread->start(); 
+2

這在很多層面上都是錯誤的。你甚至從來沒有嘗試將QTcpSocket移動到任何QThread應用程序的基本的新線程,此外,它不會工作,因爲QTcpSocket類不是線程安全的,並且具有內置的關聯性,如果你試圖從任何其他類中調用它(這將成爲你的QTcpServer運行的任何線程),那麼時間斷言失敗 – 2015-01-14 12:54:00

1

爲所有調用設置一個QMutex鎖,而不僅僅是在「不同」線程上,而是在所有線程上。一個簡單的方法,這樣做是通過QMutexLocker

+0

[「**注:**該類中的所有函數都是可重入的]](http://qt-project.org/doc/qt-4.7/qtcpsocket.html)。如果您有更權威的來源來處理您的矛盾索賠,請包括這一點。 – MSalters 2015-01-14 12:45:04

+0

你是對的。然而,(我想說的是)類不是線程安全的,重入只保證你可以在多個線程中使用類,如果你有不同的實例,但不同的'QTcpSocket'實例不能共享套接字描述符。此外,不管是否互斥,都無法從多個線程訪問「QTcpSocket」的單個實例。 – 2015-01-14 12:53:22

6

QT文檔明確指出QTCPSocket不應該跨線程使用。 I.E,在主線程中創建一個QTCPSocket,並將信號綁定到另一個線程中的對象。

我懷疑你正在實現類似於web服務器的東西,listen在listen上創建一個QTCPSocket。然後您需要另一個線程來處理處理該套接字的任務。你不能。

我對它的工作方式是將套接字保存在它出生的線程中。我爲該線程中的所有傳入數據提供服務,並將其投入到另一個線程可用於該數據的隊列中。

+0

它在哪裏說的? – 2013-12-13 20:56:02

+0

請參閱http://qt-project.org/doc/qt-4.7/qtcpserver.html#note-33 – 2013-12-13 21:07:13

+0

該說明是由社區添加的,在我的經驗中是不正確的。你也可以通過傳遞套接字描述符來模擬行爲,因爲你最終會在同一個描述符上運行兩個'QTcpSocket'實例(服務器的隱式子節點和你在新線程中創建的實例)這會導致運行時斷言失敗。 – 2015-01-14 12:30:40

0

我在文檔中看到QTcpSocket不應該跨線程使用。如果你想在另一個線程中使用它Qt文檔說你應該在你的線程中創建一個新的QTcpSocket實例,並在新實例上設置描述符。爲此,您需要重新實現QTcpServer並使用QTcpServer::incomingConnection。一個簡單的例子是here