2009-09-24 14 views
7

[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 "(.. (..))"?

Respuesta

11

Si no llama a app.exec(), entonces el programa llega al final de su main() y finaliza. (¿Por qué? No hay más código para ejecutar!)

app.exec() es un bucle infinito del siguiente estilo:

do 
{ 
    get event from system 
    handle event 
} 
while (true); 

Si se utiliza una conexión en cola, a continuación, se añade el evento a su cola de eventos, y se realizará en algún punto en el futuro durante el ciclo app.exec().

No hay un segundo subproceso en su programa. Los eventos son entregados de manera asincrónica por el sistema operativo, por lo que parece que hay algo más en juego. Existe, pero no en tu programa.

+0

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

+0

@ 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

0

app.exec() entra en el bucle de evento principal y espera hasta que se llame exit().

actualización:
El bucle principal evento y el código de unión generado por qmake cuidar de transferir el mensaje de evento de la QTcpServer a su ConnectionHandler.

Si utiliza conexiones en cola, la conexión real a la ranura QTcpServers se retrasará hasta que el bucle de evento principal entregue la solicitud de conexión .

0

Cuando dice que entra en un bucle infinito, ¿quiere decir que bloquea el programa?

Porque escuchar() se convertirá en parte del bucle de evento de la aplicación principal de la forma en que lo tiene configurado, que se ejecuta hasta que salga del programa. No estoy seguro de cuál es el problema. No debe haber ningún problema de que su señal se emita en el bucle de evento de aplicación principal (exec()) siempre que se encuentre uno.

Si lo desea, podría hacer que su clase ConnectionHandler amplíe QThread y ejecute listen() en su propio hilo, además del bucle principal de la aplicación.

Cuestiones relacionadas