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
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.
- 1. *** *** glibc détectée double libération ou de corruption (fasttop):
- 2. Que glibc détecté ... httpd: double gratuit ou corruption signifie?
- 3. Comment déboguer "glibc détecté *** python: malloc(): corruption de mémoire"
- 4. realloc et causes libres "double gratuit ou corruption"
- 5. *** glibc détecté *** gratuit(): invalide taille suivante (rapide) - devrait fonctionner?
- 6. Recherche d'un objet QObject
- 7. Glibc a détecté la corruption de la mémoire malloc() (0xb6179bb8) lors de l'appel d'un nouveau mot clé C++
- 8. Aide avec malloc et libre: Glibc détectée: free(): pointeur invalide
- 9. Comment forcer l'abandon sur "glibc detected *** free(): pointeur invalide"
- 10. Erreur avec la sous-classe `QObject` et constructeur de copie:` QObject :: QObject (const & QObject) est private`
- 11. comment puis-je hériter à la fois de QWidget et de QThread?
- 12. Faire face à une erreur "*** glibc détecté *** gratuit(): invalide taille suivante (rapide)"
- 13. QTcpSocket dans QThread
- 14. Puis-je utiliser la glibc sous windows?
- 15. QThread interaction avec GUI
- 16. Motif nul avec QObject
- 17. QThread Non À partir
- 18. Afficher un QMessageBox à partir d'un QThread
- 19. QObject (QPlainTextEdit) et problèmes de multithread
- 20. QT: Comment ouvrir plusieurs fenêtres (QWidgets) à la fois?
- 21. Comment utiliser getaddrinfo_a pour résoudre async avec la glibc
- 22. glibc, glib et gnulib
- 23. QObject cloning
- 24. QThread, enfilé, rly?
- 25. Comment convertir un objet en double?
- 26. javascript validation- objet rbColorId est encore détecté
- 27. Puis-je utiliser waitForReadyRead dans un QThread appartenant au thread principal?
- 28. Comment copier un objet dans Qt?
- 29. Listes et arbres à double liaison: utiliser ou ne pas utiliser?
- 30. Comment configurer gcc pour utiliser une autre glibc?
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? –
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. –
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) –