[relacionada con this question]señales de Qt y ranuras, roscas, app.exec(), y consultas relacionadas
yo escribimos este pedazo de código para entender cómo funcionan las señales QT y ranuras. Necesito a alguien que me explique el comportamiento y que me diga si estoy en lo cierto con mis propias conclusiones.
Mi programa:
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();
}
Ahora, r Al dejar este programa, lo envía a un bucle infinito en busca de nuevas conexiones.
Observation:
si no llamo al app.exec()
, el programa vuelve inmediatamente (como debería).
Question:
¿por qué?
Question:
si hubiera conectado la ranura como una conexión en cola, ¿cuándo se realizaría la invocación de la ranura?
Question:
si app.exec()
es un tipo infinito de bucles, ¿cómo se emite la señal newConnection()
?
Big Question:
¿Hay algún "segundo hilo" involucrado aquí? (Espero que un no, y una explicación increíblemente elegante :))
Gracias,
JRH
PS: ¿quién más tiene este síndrome paréntesis anidados? como "(.. :))" o "(.. (..))"?
Todavía queda una cosa: si el bucle de evento principal está ocupado obteniendo eventos del sistema, ¿quién los está generando? ¿cómo se emite la señal 'newConnection()', si el ciclo principal está ocupado esperando en este ciclo? – jrharshath
@ harshath.jr - No he usado QTcpServer anteriormente, pero de la documentación parece que le pide al sistema operativo que entregue eventos Tcp a su programa. Cuando su programa procesa ese evento tcp, QTcpServer hace lo que necesita, luego emite newConnection(). – Bill