2017-04-11 46 views
0

我正在修改用Qt編寫的大型項目,當某些請求到來時會產生qthreads。這些線程中的每一個都寫入一個在主線程中創建並連接到服務器的QTcpSocket。從多個線程訪問QTcpSocket

線程類具有對QTcpSocket的引用。當需要寫入它時,套接字將寫入數據並調用waitForBytesWritten,然後返回。

線程然後等待一個條件,直到readyRead信號從套接字發出。

插座上的訪問受互斥鎖保護。

對我來說,問題是我看到很多「QSocketNotifier:無法從其他線程啓用或禁用套接字通知程序」警告。這是因爲我從另一個線程寫入套接字(套接字已經在主線程中創建)。

我知道最好的解決方案應該是使用信號和插槽來寫和讀,但不幸的是項目非常複雜,我沒有時間來改變這種行爲。

我該怎麼辦?

+0

不應該太難去除直接使用'QTcpSocket'實例並使用相反的信號/插槽。編譯器將向您顯示所有需要用生成的編譯錯誤進行更改的地方。 –

+0

您有多個線程會鎖定互斥鎖,寫入套接字,等待回覆然後解鎖互斥鎖 - 是否正確?如果是這樣,它確實聽起來好像代碼使用的線程模型是根本錯誤的。這個代碼已經在工作,你必須修改它,或者它基本上都是新代碼。 –

回答

1

您可以更改您的QTcpSocket實例的thread affinity以禁止警告。

但是這真的不是正確的方法,你最好使用信號/插槽。

+0

它似乎沒有任何意義,因爲QTcpSocket可以同時從多個線程訪問...... –

+0

或只有在鎖定互斥鎖可以工作的情況下才能完成 –

+0

我以信號插槽結束......有些日子的工作,但那是唯一的好辦法。謝謝。 – mrAlmond