2010-05-12 7 views
2

J'essaye de faire un thread de serveur simple dans QT pour accepter une connexion, mais bien que le serveur écoute (je peux me connecter avec mon application de test) je ne peux pas obtenir le Signal newConnection() à actionner.Impossible d'attraper le signal newConnection() de QTcpServer

Toute aide concernant ce qui me manque ici serait grandement appréciée!


class CServerThread : public QThread 
{ 
    Q_OBJECT 

protected: 
    void run(); 

private: 
    QTcpServer* server; 

public slots: 
    void AcceptConnection(); 
}; 


void CServerThread::run() 
{ 
    server = new QTcpServer; 

    QObject::connect(server, SIGNAL(newConnection()), this, SLOT(AcceptConnection())); 

    server->listen(QHostAddress::Any, 1000); // Any port in a storm 

    exec(); // Start event loop 
} 


void CServerThread::AcceptConnection() 
{ 
    OutputDebugStringA("\n***** INCOMING CONNECTION"); // This is never called! 
} 

Répondre

2

d'abord tout ce que je peux dire que votre serveur habite nouveau thread en exemple CServerThread vit dans un autre thread (dans le fil de cette instance a été créée). La connexion signal/slot que vous créez est inderect et utilise la sauvegarde d'événement thread save entre les boucles d'événements de deux threads différents. En fait, cela peut causer un tel problème si thread où vous créez CServerThread n'a pas de boucle d'événements Qt en cours d'exécution.

Je vous suggère de créer une classe MyServer qui crée QTcpServer et appelle écoute et connecte le signal QTcpServer :: newConnection() à son propre emplacement. Puis réécrire votre méthode d'exécution de fil de serveur à quelque chose comme ceci:

void CServerThread::run() { 
    server = new MyServer(host,port); 
    exec(); // Start event loop 
} 

Dans cette approche les deux vies d'objet de traitement QTcpServer et NewConnection dans le même fil. Une telle situation est plus facile à gérer.

J'ai un exemple de travail très simple:

tête: http://qremotesignal.googlecode.com/svn/tags/1.0.0/doc/html/hello_2server_2server_8h-example.html

Source: http://qremotesignal.googlecode.com/svn/tags/1.0.0/doc/html/hello_2server_2server_8cpp-example.html

+0

Merci beaucoup, je vais retravailler cela comme suggéré. – Bob