2010-02-24 65 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

相关问题