[lié à Cette question ]
J'ai écrit ce morceau de code pour comprendre comment fonctionne des signaux QT et des machines à sous fonctionnent. J'ai besoin de quelqu'un pour expliquer le comportement et me dire si j'ai raison à propos de mes propres conclusions. P>
Mon programme: p>
ConnectionHandler.h code>
#include <QCoreApplication>
#include "connectionhandler.h"
int main(int argc, char* argv[]) {
QCoreApplication app(argc,argv);
ConnectionHandler handler;
return app.exec();
}
3 Réponses :
Si vous utilisiez des connexions en file d'attente, la connexion réelle au logement code> qtcpservers code> serait retardé jusqu'à ce que la boucle d'événement principale fournit la demande de connexion EM>. P>. P> app.exec () code> entre la boucle d'événement principale et attend jusqu'à ce que
quitte () code> est appelé. P>
La boucle d'événement principale et le code de colle généré par QMake s'occupent de transférer le message d'événement à partir du qtcpserver code> à votre
ConnectionHandler code>. P>.
Lorsque vous dites qu'il entre dans une boucle infinie, vous voulez dire qu'il bloque le programme? p>
Parce que l'écoute () fera partie de la boucle d'événement de l'application principale de la manière dont vous l'avez configurée, qui fonctionne jusqu'à ce que vous quittiez le programme. Je ne suis pas sûr de ce que le problème est. Il ne devrait pas y avoir de problèmes de votre signal émis dans la boucle d'événement d'application principale (EXEC ()) chaque fois que l'on est rencontré. P>
Si vous le souhaitez, vous pouvez avoir votre classe ConnectionHandlerler étendre qthread et exécuter écouter () dans son propre fil, mis à part la boucle principale de l'application. P>
Si vous n'appelez pas App.Exec (), le programme frappe la fin de votre principale () et se termine. (Pourquoi? Il n'y a plus de code à exécuter!)
app.exec () est une boucle infinie du style suivant: p> si vous utilisez une connexion en file d'attente, Ensuite, l'événement est ajouté à votre file d'attente d'événement et il sera effectué à un moment donné à l'avenir pendant la boucle APP.EXEC (). P> Il n'y a pas de deuxième fil dans votre programme. Les événements sont livrés de manière asynchrone par le système d'exploitation, c'est pourquoi il semble qu'il y ait quelque chose d'autre. Il y a, mais pas dans votre programme. P> p>
Il reste toujours une chose: si la boucle d'événement principal est occupée à obtenir des événements du système, qui les génère? Comment le signal newconnection () code> jamais émis, si la boucle principale est occupée à attendre dans cette boucle?
@ HARSHATH.JR - Je n'ai pas utilisé Qtcpserver avant, mais à partir de la documentation, on dirait qu'il demande au système d'exploitation de livrer des événements TCP à votre programme. Lorsque votre programme traite cet événement TCP, le QTcSperserver fait ce dont il a besoin, puis émet une nouvelle-nord ().