Qt signaux et les slots, les threads, app.exec(), et les questions relatives à l'
[liés à la cette question]
J'ai écrit ce morceau de code pour comprendre comment qt signaux et les slots de travail. J'ai besoin de quelqu'un pour expliquer le comportement, et de me dire si j'ai raison à propos de mes propres conclusions.
Mon programme:
connectionhandler.h
#ifndef CONNECTIONHANDLER_H
#define CONNECTIONHANDLER_H
#include <QTcpServer>
class ConnectionHandler : public QObject
{
Q_OBJECT
public:
ConnectionHandler();
public slots:
void newConn();
private:
QTcpServer *server;
};
#endif //CONNECTIONHANDLER_H
connectionhandler.cpp
#include "connectionhandler.h"
#include <QTextStream>
ConnectionHandler::ConnectionHandler() {
server = new QTcpServer;
server->listen(QHostAddress::LocalHost, 8080);
QObject::connect(server, SIGNAL(newConnection()),this, SLOT(newConn()));
}
void ConnectionHandler::newConn() {
QTextStream out(stdout);
out << "new kanneksan!\n";
out.flush();
}
main.cpp
#include <QCoreApplication>
#include "connectionhandler.h"
int main(int argc, char* argv[]) {
QCoreApplication app(argc,argv);
ConnectionHandler handler;
return app.exec();
}
Maintenant, l'exécution de ce programme envoie dans une boucle infinie à la recherche de nouvelles connexions.
Observation:
si je ne l'appelez pas app.exec()
, le programme renvoie immédiatement (comme il se doit).
Question:
pourquoi?
Question:
si j'avais branché la fente comme une file d'attente de connexion, quand le logement invocation être effectuée?
Question:
si app.exec()
est une boucle infinie de toutes sortes, comment le newConnection()
signal jamais émis?
Big Question:
Est leur tout "deuxième thread"? (Je m'attends à un pas, et un incroyablement élégant explication 🙂 )
Merci,
jrh
PS: qui d'autre a cette parenthèse imbriquée syndrome? comme "(.. :))" ou "(.. (..))"?
OriginalL'auteur jrharshath | 2009-09-24
Vous devez vous connecter pour publier un commentaire.
Si vous n'appelez pas app.exec (), alors le programme de frappe à la fin de votre main() et se termine. (Pourquoi? Il n'y a plus de code à exécuter!)
app.exec() est une boucle infinie du style suivant:
Si vous utilisez une file d'attente de connexion, alors l'événement est ajouté à votre file d'attente des événements, et il sera effectué à un certain moment dans l'avenir au cours de l'application.exec() de la boucle.
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 a quelque chose d'autre se passe. Il y est, mais pas dans votre programme.
newConnection()
signal jamais émis, si la boucle principale est occupé attente dans cette boucle?Je n'ai pas utilisé QTcpServer avant, mais à partir de la documentation, on dirait qu'il demande à l'OS de livrer Tcp événements de votre programme. Lorsque votre programme processus tcp événement, le QTcpServer fait ce qu'il doit, puis émet newConnection().
OriginalL'auteur Bill
app.exec()
entre dans la boucle principale et attend jusqu'à ceexit()
est appelé.mise à jour:
La boucle principale et de la colle le code généré par qmake prendre soin de transférer le message d'événement à partir de la
QTcpServer
à votreConnectionHandler
.Si vous souhaitez utiliser la file d'attente de connexions la connexion réelle à la
QTcpServers
logement serait retardée jusqu'à ce que la boucle principale offre la demande de connexion.OriginalL'auteur Georg Fritzsche
Lorsque vous dites qu'il entre dans une boucle infinie, tu veux dire que ça bloque le programme?
Parce que listen() feront partie des principaux événements de l'application de la boucle de la façon dont vous avez mis en place, qui fonctionne jusqu'à ce que vous quittez le programme. Je ne suis pas sûr que le problème est. Il devrait y avoir aucun problème de votre signal étant émis dans l'application principale boucle (exec()) chaque fois qu'elle est rencontrée.
Si vous le souhaitez, vous pourriez avoir votre ConnectionHandler classe étendre QThread et exécuter listen() dans son propre thread, en dehors de la boucle principale de l'application.
OriginalL'auteur JimDaniel