2010-02-24 67 views

回答

2

通常你應該只允許一個線程來處理每個QObject的。在這種情況下,您可能希望讓QThread保持並使用QUDPSocket,並且主線程不會觸及它(理想情況下,主線程甚至不應該持有指向QUDPSocket的指針,只是爲了確保您永遠不會忘記和不小心從錯誤的線程調用它的方法)。

當您的QThread讀取一些UDP數據時,它可以對其進行任何初始化處理,然後通過QApplication :: postEvent()或通過排隊信號/槽連接將數據傳遞到主線程。

同樣,如果你的主線程有一些數據,它希望作爲一個UDP數據包被髮送出去,它不應該直接調用QUdpSocket提供對象的write();相反,它應該通知QThread(通過postEvent()或排隊信號)並讓QThread處理它。

+0

Thx。只有問題剩下的是我在哪裏instanciate我的變量。例如,我使用帶有readDatagram函數的QByteArray,然後我需要將這個QByteArray的內容填充到我所做的結構中。我在哪裏實例化這些結構,以便我可以將它們分配到Qthread中,並最終從主線程中讀取它們? – 2010-02-24 23:27:40

+0

我認爲最簡單,最安全的方法是做在的QThread以下的的QThread已經閱讀一個UDP包後: 的QByteArray myByteArray(的sizeof(MYSTRUCT),0); struct MyStruct * structToFill =(struct MyStruct *)myByteArray.data(); structToFill-> someDataField = 5; //或任何數據傳到這裏 [...] emit myStructReceived(myByteArray); //通過排隊信號 告訴主線程這樣做,這樣避免了內存泄漏的任何機會,等 – 2010-02-24 23:38:31

+0

所以我絕對需要通過信號發送的數據或可他們只是駐留在QThread的對象,並進行訪問來自兩個線程。 (當然,他們絕不會同時訪問相同的數據) – 2010-02-25 00:08:43

相關問題