Je construis un petit serveur Web multithreaded. Les qtcpsockets sont récupérés dans le fil principal, puis remettent par qtconcurrent sur qthreadpool, ce qui finit par traiter les données et envoie une réponse.
Mon problème est que la prise est créée dans le fil principal et traitées dans une autre. Cela provoque des erreurs lorsque vous essayez d'écrire sur la prise: P>
socket->moveToThread(QThread::currentThread()).
3 Réponses :
Bradley Hugues a écrit un poste sur les laboratoires Qt en parlant de ce sujet, peut-être que cela vous aidera un peu! p>
https://www.qt.io / Blog / 2010/06/17 / Toi-faire-it-it-it-it-orth
Merci, je sais ce post. En fait, je le fais exactement de cette façon pour le moment, mais cela ne fonctionne pas avec une piscine de fil, que j'aimerais utiliser. Lorsque vous distribuez du travail à plusieurs threads, vous vous retrouvez dans la programmation de quelque chose comme une piscine de la bande de roulement, alors pourquoi n'utilisez-vous pas l'existant? :)
EXTENDRE qtcpserver code>, réimplément
incomingconnection (int socketDescriptor) code> et transmettez le descripteur de prise sur les threads de la piscine. Avoir le
qRunnable code> créer le
qtcpsocket code> à partir du descripteur et démarrez une boucle d'événement pour recevoir les signaux de ce socket. P>
Je serais également d'accord que l'attrape Mais votre problème était un problème plus fondamental, permettez-moi de montrer une alternative qui résout le problème général (déplacement arbitraire dans le fil principal: dissocier la prise de n'importe quel thread: p>
socket-> movetothread (nullptr); p>
Cela suspendra le traitement des événements de la prise. Puis transmettez-le à Qtconcurrent. P> li>
dans la fonction exécutée sur la piscine de thread, vous peut em> appelez maintenant p>
socket-> movetothread (QThread :: courantethread ()); p>
Cela redémarrera le traitement des événements. P> li>
ol>
Avec toute chance, la prise aura ses notificateurs de socket ré-enregistrés avec la boucle d'événement du thread de travailleur, et vous pouvez servir la connexion du travailleur. P>
Il y a deux em> les mises en garde importantes em> strong> ici, bien que: p>
Si vous souhaitez réellement mettre en œuvre un serveur TCP multi-threadé, vous devez donc rouler votre propre piscine de thread. p> incomingingconnection (int) code> et créer la prise dans le thread du travailleur est le moyen d'aller ici. P>
QOBJECT code> S à des threads dans un piscine de thread): P>
qthreadpool :: globalinstance () code>). Comme le nom de la fonction suggère, cette instance de piscine de thread est une ressource globale, partagée par tous les utilisateurs de Qtconcurrent et bloquant ses fils de travailleurs dans le meilleur cas réduit la capacité (ainsi, le débit) de la piscine et dans le pire des cas LOCK-LOCK. LI>
qtcpsocket code>, en raison du premier point), vous devez appeler
qthread :: courantethread ( ) -> EXEC () code> pour le démarrer. Cela, cependant, est un appel de blocage et du planificateur de piscine de thread, le travailleur aura l'air occupé, de sorte qu'il ne lui rendra pas plus de tâches (c.-à-d.
QRunnable code> s). LI>
ul>