J'ai un QThread qui contient un QUDPsocket (socket est membre non local à QThread :: run(), peut-être que je devrais changer cela de ce que je lis). Ce QThread est instancié dans ma classe QMainWindow, c'est-à-dire le thread graphique (je n'appelle pas move to thread). Est-il toujours prudent d'utiliser waitForReadyRead ou ai-je absolument besoin d'instancier le QThread dans main.cpp ou d'appeler moveToThread() pour qu'il soit thread-safe. Je reçois intermittent double exception libre dans l'appel à waitForReadyRead dans la manière actuelle de le faire (parfois je ne l'obtiens pas pendant des jours parfois après 3 minutes).Puis-je utiliser waitForReadyRead dans un QThread appartenant au thread principal?
Répondre
Jetez un oeil à la Qt documentation pour QUdpSocket
. Il y a une note expliquant que la classe est reentrant. En outre de la Qt documentation:
... une classe est dite rentrante si ses fonctions membres peuvent être appelés en toute sécurité à partir de plusieurs threads, tant que chaque thread utilise une autre instance de la classe.
Ainsi, pour répondre à votre question, il ne compte pas vraiment ce que le parent du QThread
est, aussi longtemps que vous assurez-vous que l'instance QUdpSocket
que vous utilisez est instancié dans le contexte du fil que vous utilisez il en
Même en mettant QUdpSocket en tant que membre de classe de QThread, il n'était pas suffisant pour se débarrasser de l'exception intemrittent double libre qu'il générait à l'intérieur il appelle waitForReadyRead() –
Où construisez-vous l'objet 'QUdpSocket'? Construire dans le constructeur du thread n'est pas suffisant car le constructeur s'exécute dans le contexte du thread principal. Vous devez le construire dans la méthode 'run()' elle-même. –
- 1. Fonction asynchrone - rappel utilisant un objet appartenant au thread principal
- 2. Comment utiliser AsyncSocket dans un thread de travail au lieu du thread principal?
- 3. C# - Renvoie les données du thread ThreadPool au thread principal
- 4. Accéder au thread principal avec le rappel
- 5. NSInvocationOperation et thread principal
- 6. Thread Android principal sortant
- 7. L'utilisation de NSInvocationOperation pour renvoyer des messages au thread principal?
- 8. QTcpSocket dans QThread
- 9. Comment tuer le thread principal du sous-thread dans Jython
- 10. Shift Control du fil de backgrount au thread principal
- 11. Disposer des ressources ActiveX appartenant à un autre thread
- 12. MFC PostMessage du projet principal au thread de l'interface utilisateur
- 13. Boost asio udp waitForReadyRead
- 14. C# effacement du thread principal
- 15. Exception dans le thread "principal" java.lang.NoClassDefFoundError
- 16. Création d'une boucle d'événement QThread dans un thread existant non QT
- 17. Thread.join bloque le thread principal
- 18. Exception dans le thread "principal" java.lang.NoSuchMethodError: principale
- 19. Envoyer un message directement à partir d'un thread à un objet sans utiliser le formulaire principal
- 20. Test de Wicket - AnnotApplicationContextMock - Il n'y a pas d'application attachée au thread principal principal
- 21. QThread interaction avec GUI
- 22. QThread bloquant l'application principale
- 23. Question sur l'implémentation de QThread
- 24. QThread, enfilé, rly?
- 25. Lever des exceptions non gérées dans un thread dans le thread principal?
- 26. NSOperation et NSNotificationCenter sur le thread principal
- 27. Log4Net fonctionne dans le thread principal mais pas dans le thread créé
- 28. Traitement du thread principal du processus
- 29. animateWithDuration: animations: blocage du thread principal?
- 30. Attendre que le thread principal s'arrête jusqu'à ce qu'une tâche soit traitée par un thread asynchrone
jusqu'à maintenant, il semble que non. Vous pouvez probablement l'appeler à partir d'un événement QAction mais pas former un QThread résidant dans le thread principal. –
Appelez-vous waitForBla() dans la méthode d'exécution QThreads? – drahnr
oui je l'utilise à partir de là mais avant de faire moveToThread (this) le QThread résidait toujours dans le thread principal qui faisait waitForBla générer une double exception gratuite de temps en temps –