2010-02-26 3 views
2

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?

+0

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. –

+0

Appelez-vous waitForBla() dans la méthode d'exécution QThreads? – drahnr

+0

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 –

Répondre

1

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

+0

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() –

+0

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. –

Questions connexes