Comment exécuter des fonctions QTcpSocket dans un thread différent?Comment exécuter QTcpSocket dans un thread différent?
Répondre
Voici l'exemple:
fichierthread.h:
class Thread : public QThread {
Q_OBJECT
public:
Thread();
protected:
void run();
}
fichier
thread.cpp:
Thread::Thread() {}
void Thread::run() {
// do what ever you want with QTcpSocket
}
dans le principal. cpp ou peu importe:
Thread *myThread = new Thread;
connect(myThread, SIGNAL(finished()), this, SLOT(on_myThread_finished()));
myThread->start();
Mettez un verrou QMutex
autour de tous les appels, pas seulement sur le thread "différent" mais sur tous les threads. Un moyen facile de le faire est par un QMutexLocker
["** Remarque: ** Toutes les fonctions de cette classe sont réentrantes"] (http://qt-project.org/doc/qt-4.7/qtcpsocket.html). Si vous avez une source plus fiable pour votre réclamation contradictoire, veuillez l'inclure. – MSalters
Vous avez raison. Cependant, (et ce que je voulais dire) la classe n'est pas thread-safe, et la ré-entrée garantit seulement que vous pouvez utiliser la classe de plusieurs threads si vous avez différentes instances, mais différentes instances de 'QTcpSocket' ne peuvent pas partager des descripteurs de socket . De plus, une seule instance d'un 'QTcpSocket' ne peut pas être accédée à partir de plusieurs threads, qu'elle soit ou non mutexée. –
Les docs QT sont explicites que le QTCPSocket ne doit pas être utilisé à travers les threads. I.E, créer un QTCPSocket dans le thread principal et avoir le signal lié à un objet dans un autre thread.
Je suppose que vous implémentez quelque chose comme un serveur Web où l'écoute crée un QTCPSocket sur l'acceptation. Vous voulez ensuite un autre thread pour gérer la tâche de traitement de ce socket. Tu ne peux pas. La façon dont j'ai travaillé autour de cela est que j'ai gardé le socket dans le fil dans lequel il est né. J'ai géré toutes les données entrantes dans ce fil et l'ai jeté dans une file où un autre thread pourrait travailler sur ces données.
Où est-ce que cela dit? –
Voir http://qt-project.org/doc/qt-4.7/qtcpserver.html#note-33 –
Cette note a été ajoutée par la communauté, et dans mon expérience de l'empereur n'est pas correcte. Il ne semble pas non plus que vous puissiez simuler le comportement en passant des descripteurs de socket comme ils le prétendent, puisque vous vous retrouvez avec deux instances 'QTcpSocket' (l'enfant implicite du serveur et l'instance que vous créez dans le nouveau thread) s'exécutant sur le même descripteur, ce qui provoque des échecs d'assertion d'exécution. –
Ce que je lis dans les docs est que QTcpSocket ne doit pas être utilisé sur plusieurs threads. Si vous souhaitez l'utiliser dans un autre thread, les docs Qt disent que vous devez créer une nouvelle instance QTcpSocket dans votre thread et définir le descripteur sur la nouvelle instance. Pour ce faire, vous devez réimplémenter QTcpServer et utiliser QTcpServer::incomingConnection. Un exemple simple est fourni here.
- 1. glutPostRedisplay dans un thread différent
- 2. QTcpSocket dans QThread
- 3. Envoyer un message à un thread différent
- 4. Exécuter le processus d'arrière-plan dans un thread différent en Java
- 5. Dans Android, comment exécuter un service en tant qu'utilisateur différent?
- 6. Comment exécuter une minuterie dans un thread séparé?
- 7. Mise à jour possible dans un thread différent (WPF)
- 8. capturer une pile d'appels et l'exécuter dans un thread différent
- 9. Lecture d'une valeur manipulée dans un thread différent
- 10. Mettez un contrôle GUI sur un thread différent?
- 11. QNetworkAccessManager/QNetworkRépondez avec QTcpSocket personnalisé?
- 12. Comment pouvez-vous abandonner un thread et faire exécuter du code dans ce thread?
- 13. Manipulation d'un thread à partir d'un thread différent
- 14. Comment exécuter un programme Java à partir d'un répertoire différent?
- 15. Puis-je exécuter un thread plusieurs fois?
- 16. comment connecter un signal à un emplacement dans un thread différent?
- 17. Connexion à un TcpListener sur un thread différent, même processus
- 18. Comment puis-je exécuter certaines commandes sur un thread séparé?
- 19. QT + Comment appeler un emplacement à partir d'un code C++ personnalisé s'exécutant dans un thread différent
- 20. Comment rompre une boucle qui s'exécute dans un thread différent en utilisant un TimerCallback en C#?
- 21. exécuter la fonction dans un autre thread que gui
- 22. WPF Gui rafraîchir de thread différent
- 23. Invoquer à partir de thread différent
- 24. Comment exécuter un fichier .exe avec dll dans un emplacement différent
- 25. Pouvez-vous relancer une exception .NET sur un thread différent?
- 26. android: InputConnection à partir de thread différent.
- 27. Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède
- 28. Le thread appelant ne peut pas accéder à cet objet car un thread différent le possède
- 29. accès au fichier Problème de thread différent dans Asp.net
- 30. Exécuter un EXE à partir d'un répertoire différent?
C'est faux sur tant de niveaux. Vous n'essayez même jamais de déplacer le QTcpSocket vers le nouveau thread, ce qui est fondamental pour n'importe quelle application QThread, et en plus, cela ne fonctionnerait pas car la classe QTcpSocket n'est pas thread-safe et a une affinité intégrée qui provoque le run- échecs d'assertion de temps si vous tentez de l'invoquer à partir de n'importe quelle classe autre que celle dans laquelle elle a été construite (quel que soit le thread dans lequel votre QTcpServer s'exécute) –