2010-02-24 3 views
0

J'ai un qthread qui utilise un socket udp pour écrire et lire des datagrammes dans une boucle. le QUDPSocket est créé dans le thread principal. Comment gérer QObjects que j'utiliserai dans QThread et mainthread. Est-ce qu'il est également possible d'avoir le socket UDP dans le thread principal et de l'utiliser dans le qthread?Comment puis-je utiliser un objet QObject à la fois dans qthread et mainthread afin d'éviter "glibc détecté double free ou corruption (fasttop):"?

Répondre

2

En règle générale, vous ne devez autoriser qu'un thread à traiter chaque QObject. Dans ce cas, vous voudriez probablement avoir votre QThread en attente et utiliser le QUDPSocket, et le thread principal ne le toucherait jamais (idéalement, le thread principal ne devrait même pas contenir un pointeur sur le QUDPSocket, juste pour être sûr oubliez et appelez accidentellement une méthode à partir du mauvais fil). Lorsque votre QThread lit des données UDP, il peut effectuer un traitement initial, puis transmettre les données au thread principal via QApplication :: postEvent() ou via une connexion signal/slot en file d'attente. De même, si votre thread principal a des données qu'il souhaiterait envoyer en tant que paquet UDP, il ne doit pas appeler write() directement sur l'objet QUDPSocket; à la place, il doit notifier QThread (via postEvent() ou un signal en file d'attente) et laisser QThread le gérer.

+0

Thx. Seule la question restante est où j'instancie mes variables. Par exemple, j'utilise un QByteArray avec la fonction readDatagram, puis j'ai besoin de remplir le contenu de ce QByteArray dans les structures que j'ai créées. où est-ce que j'instancie ces structures pour que je puisse les assigner dans le Qthread et les lire éventuellement dans le thread principal? –

+0

Je pense que la façon la plus facile et la plus infaillible serait de faire ce qui suit dans QThread, après que QThread ait lu un paquet UDP: QByteArray myByteArray (sizeof (MyStruct), 0); structure MyStruct * structToFill = (struct MyStruct *) myByteArray.data(); structToFill-> someDataField = 5; // ou quelle que soit la donnée utilisée ici [...] emit myStructReceived (myByteArray); // tell the main thread via un signal en file d'attente Ainsi, cela évite tout risque de fuite de mémoire, etc. –

+0

J'ai donc absolument besoin d'envoyer les données via un signal ou peut-il simplement résider dans l'objet qthread et être accessible? à partir des deux threads. (ils n'auraient bien sûr jamais accès aux mêmes données simultanément) –

Questions connexes