IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

[Qt 4] signaux non reçus entre thread


Sujet :

Qt

  1. #1
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut [Qt 4] signaux non reçus entre thread
    Salut !
    Petit problème de signaux jamais reçus...
    Dans un thread (classe dérivée de QThread) je lance une connexion réseau avec QTcpSocket, que j'ai préalablement connecté à des slots sur mon thread. En fait j'ai suivi l'exemple de la doc Qt pour la classe QThread.
    Hors, je ne reçois jamais de notification de la part de QTcpSocket, malgré le fait que j'ai fait les connexions en mode "queued_connection".
    Voici le code de ma classe dérivée de QThread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    #include "sirifserver.h"
     
    SirifServer::SirifServer(int port, const QHostAddress& address, const QString& name, QObject* pParent):QThread(pParent)
    {
       m_IpAddress = address;
       m_QStrName = name;
       m_Port = port;
    }
     
     
    /** main loop of the thread */
    void SirifServer::run()
    {
       connect( &m_TcpSocket,
                SIGNAL(error(QAbstractSocket::SocketError)),
                this,
                SLOT(error(QAbstractSocket::SocketError)),
                Qt::QueuedConnection );
     
       connect( &m_TcpSocket,
                SIGNAL(stateChanged(QAbstractSocket::SocketState)),
                this,
                SLOT(stateChanged(QAbstractSocket::SocketState)),
                Qt::QueuedConnection );
     
       // Launch the connection
       m_Mutex.lock();
       if ( m_QStrName.length() )
          m_TcpSocket.connectToHost( m_QStrName, m_Port );
       else
          m_TcpSocket.connectToHost( m_IpAddress, m_Port );
       m_Mutex.unlock();
       exec();
    }
     
    void SirifServer::connectToRemote()
    {
       // Check if the thread is already launch, if not launched, launch it now
      if ( !isRunning() )
          start();
    }
     
    /** This Qt signal is emitted by the QTcpSocket. */
    void SirifServer::error(QAbstractSocket::SocketError ErrorValue)
    {
       emit error( m_QStrName, ErrorValue );
    }
     
    /** This Qt signal is emitted by the QTcpSocket. */
    void SirifServer::stateChanged( QAbstractSocket::SocketState State)
    {
       emit stateChanged( m_QStrName, State );
    }
    normalement les signaux devraient être reçus dans les fonctions error() et stateChanged(), mais je ne reçois rien.
    Par contre, si je place la déclaration des connections et l'appel à connectToHost() dans le constructeur de la classe SirifServer() (donc dans le thread principal) alors là, je reçois bien les signaux.
    On dirait que les signaux ne passe pas les thread....

    Des idées ? parce que là, je sèche.
    :-\

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Le thread est bien exécuté ? Si la boucle d'évènements de ton thread ne tourne pas, il ne peux pas traiter les évènements et donc les signaux.

  3. #3
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    En fait mon thread principale (qApp) appelle la fonction SirifServer::connectToRemote(), qui va démarrer le thread.
    De plus, j'ai mis un point d'arrêt dans la fonction run() pour vérifier, et effectivement, mon thread est bien démarré.
    Donc, mon thread tourne bien.....

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Mais pas la boucle de gestion des évènements... Il faut appeler exec pour cela.

  5. #5
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    eh bien, c'est ce que je fais dans la fonction run() du thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    /** main loop of the thread */
    void SirifServer::run()
    {
       connect( &m_TcpSocket,
                SIGNAL(error(QAbstractSocket::SocketError)),
                this,
                SLOT(error(QAbstractSocket::SocketError)),
                Qt::QueuedConnection );
     
       connect( &m_TcpSocket,
                SIGNAL(stateChanged(QAbstractSocket::SocketState)),
                this,
                SLOT(stateChanged(QAbstractSocket::SocketState)),
                Qt::QueuedConnection );
     
       // Launch the connection
       m_Mutex.lock();
       if ( m_QStrName.length() )
          m_TcpSocket.connectToHost( m_QStrName, m_Port );
       else
          m_TcpSocket.connectToHost( m_IpAddress, m_Port );
       m_Mutex.unlock();
       exec();
    }
    comme le fait d'ailleurs l'exemple de QThread de la doc de Qt :
    http://qt.developpez.com/doc/4.2/qthread/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     class MyThread : public QThread
     {
     public:
         void run();
     };
     
     void MyThread::run()
     {
         QTcpSocket socket;
         // connect QTcpSocket's signals somewhere meaningful
         ...
         socket.connectToHost(hostName, portNumber);
         exec();
     }

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    zut, je ne l'avais as vu

    Est-ce que tu as une console pour t'afficher les messages d'erreur ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 83
    Points : 93
    Points
    93
    Par défaut
    Je soupçonne que le type des arguments QAbstractSocket::SocketError n'est pas connu de Qt :
    With queued connections, the parameters must be of types that are known to Qt's meta-object system, because Qt needs to copy the arguments to store them in an event behind the scenes. If you try to use a queued connection and get the error message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     QObject::connect: Cannot queue arguments of type 'MyType'
    call qRegisterMetaType() to register the data type before you establish the connection.

Discussions similaires

  1. [vb.net][Thread] Basculer entre Thread
    Par arnolem dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2006, 18h59
  2. [c#][threading] communication entre threads
    Par orelero dans le forum C#
    Réponses: 6
    Dernier message: 02/01/2006, 00h42
  3. [xpath]selectionner le contenu NON enfants entre 2 balises
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/11/2005, 11h26
  4. probleme d'espace non voulu entre 2 bloc
    Par piff62 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 12/04/2005, 16h07
  5. [API] Communication série NON-bloquante : OVERLAPPED/Thread
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 07/11/2003, 13h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo