QT: socket déclarants ne peut pas être activé à partir d'un autre thread
J'ai un QTcpSocket et j'ai besoin de contrôler elle - écriture + lecture à l'aide de plusieurs threads.
Cela fonctionne bien en QT4, mais dans QT5 j'obtiens cette erreur et il semble que seul 1 thread a accès à la socket en même temps. Comment puis-je faire il possible pour un socket pour être accessible par plusieurs threads?
Fondamentalement, je veux créer 1 fil pour la lecture et 1 filetage pour l'écriture de données, afin que je puisse de manière asynchrone de lire et de traiter les données en faisant autre chose dans le reste de l'application.
Note: réponse à la Qt - Poignée de QTcpSocket dans un nouveau thread n'aide pas ici, car elle explique comment transférer de la prise de thread 1 thread 2 et ensuite l'utiliser à partir de fil de 2 seulement. J'ai besoin de l'utiliser à partir de deux fils.
Eh bien, une lecture et une écriture fil devrait être OK. Plus d'un recv va être un problème, car un TCP de flux d'octets ne peut pas envoyer des messages de plus d'un octet aucun rx thread peut obtenir dans et rx partielle de la mémoire tampon. Je dirais que @Merlin069 a la solution à cette file d'attente de requête/réponse objets à un fil.
vous pouvez utiliser de la croix-fil de signaux/slots pour envoyer autour de la lecture des données/les données à écrire. Je me demande encore ce que le cas d'utilisation est de partager une seule prise, je m'attends à ce qu'il exige beaucoup plus élevé au niveau de la synchronisation (comme Martin l'indique) pour être d'une quelconque utilité.
message d'erreur" erreur dans le sujet (socket déclarants ne peut pas être activé à partir d'un autre thread)
oui - c'est ce que je suis en train de réaliser l'une pour l'écriture, et 1 pour la lecture, mais apparemment je ne peux pas créer un thread pour cette
OriginalL'auteur Petr | 2013-11-18
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez interagir directement avec le support d'un fil (le fil doit avoir une boucle d'événement en cours d'exécution - donc, vous devriez avoir demandé
exec()
). Si vous voulez en lecture/écriture à partir d'un autre thread, vous aurez besoin d'utiliser des Signaux/Slots.De la connexion d'un Signal émis sur un thread à un Logement d'un objet sur un autre thread en utilisant le type de connexion par défaut (
Qt::AutoConnection
) va automatiquement s'assurer un coffre-fort thread transfert se produit (à l'aide d'une file d'attente de connexion). Vous pouvez explicitement connecter un Signal à un Slot à l'aide deQt::QueuedConection
, maisQt::AutoConnection
devrait fonctionner correctement.Comme les commentaires sur votre question à dire, vous avez besoin de bien réfléchir à pourquoi vous avez besoin de ce comportement, avez-vous vraiment besoin de lire les mêmes données reçues par la prise de 2 threads séparés?
OriginalL'auteur oggmonster