2016-07-06 158 views
5

我有一個線程服務器。連接啓動後將QTcpSocket移動到一個新線程

與QTcpSocket需要被它需要跑線,FI創建於:通過傳遞套接字描述符Qt - Handle QTcpSocket in a new thread

我的問題是,我需要有線程池和移動插座上的一個特定的線程後,客戶端已派出其上線的插座必須定義一個特定的標記。

換句話說,我需要讀取插槽知道哪個線程事先放置。

一些想法是先綁定到與QTcpSocket,讀,然後發送描述符線程並創建另一個與QTcpSocket但醫生說:

注:這是不可能的初始化兩個抽象插座與 相同的本地套接字描述符。

另一種解決方案是在分離的線程中創建套接字,然後將兩個線程連接在一起,但我不知道這是否可能。

或許能夠在子線程調用上之前setSocketDescriptor閱讀在主線程中的socket描述符,如果這甚至有可能?

+1

出於好奇,爲什麼你必須使客戶端告訴你,你必須在運行'QTcpSocket'哪個線程? – Mike

+0

*定義在哪個線程上套接字需要的特定標記* - 我想知道如何指定套接字需要的線程。 AFAIK在創建線程時不能指定線程ID。如果你想指定線程名稱,你可以調用thread-> setObjectName(「Name」),這與套接字無關。 – rightaway717

+0

你爲什麼不簡單地做socket-> moveToThread(otherthread)? –

回答

0

您完全可以輕鬆地移動插座跨越QThreads,只是要注意四兩件事:

1)確保您與QTcpSocket沒有父母,你移動

2)之前的舉動之前,斷開一切從套接字對象

3)連接任何你需要回到其在目標線程運行的功能(你可以使用某種池的線程有線程之前存儲那些「移動」的對象去接他們

4)初始化後調用readAll(),因爲你可能會遺漏一些readyRead()信號

看不到任何理由不這樣做,如果這符合設計,至少我多次使用它多線程服務來分割套接字處理器核心。

+1

在寫入數據時,您將收到'QIODevice'的警告。因爲不是'QTcpSocket'的所有字段都可以在線程之間移動。 –

+0

最近幾年所有工作都很好,因爲我在許多項目中使用了這種技術。你能指定你的意思是什麼樣的警告嗎? – evilruff

+1

我會嘗試查找更多,因爲我無法訪問代碼庫。但有下一個警告:「QSocketNotifier:套接字通知器不能從另一個線程啓用」 –