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 :

problème de connect()


Sujet :

Qt

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut problème de connect()
    Bonjour,

    J'ai connecté tous les threads créés avec la classe appelante. J'ai un emit et un slot personnalisés.

    Le code compile et passe bien sur l'emit mais la fonction slot ne semble jamais être appelée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     class Compil : public QObject
    {
    	Q_OBJECT
     
    public:
    	Compil(QStringList* );
     
     
    private slots:
          void showProgress();	
     
     
    };
    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
    Compil::Compil(QStringList* ListeJob)
    {
     
    qDebug() << "Classe Compil";
     
     
      QStringList * ListeStdOut = new QStringList ();
      QStringList * ListeStdErr = new QStringList ();
     
      QList<Thread*> threadList;
     
      int noeuds(4);  
     
      for (int i(0) ; i < noeuds ; ++i)
      {
      	Thread * pThread = new Thread(ListeJob, ListeStdOut, ListeStdOut, i);
      	QObject::connect(pThread, SIGNAL(compilationFinished()),this, SLOT(showProgress()));
      	pThread->start();
      	threadList << pThread;
      }  
     
        while (threadList.count () > 0) {
          threadList[0]->wait ();
          delete threadList[0];
          threadList.removeFirst ();
       }
     
       delete ListeJob;
       delete ListeStdOut;
       delete ListeStdErr;
    }
     
     void Compil::showProgress()
     {
      qDebug() << "SIGNAL" ;	
     }
    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
    Thread::Thread(QStringList * liste_job, QStringList * liste_StdOut, QStringList * liste_StdErr, int i)
    {
      ListeJob = liste_job;
      ListeStdOut = liste_StdOut;
      ListeStdErr = liste_StdErr;
      num_thread = i;
    }
     
    void Thread::run()
    {
    	qDebug() << "Thread " << num_thread;
     
      forever {
     
         (...)
     
           qDebug() << "emit";
           emit compilationFinished();
        }
        else {
              mutexListeJob.unlock();
              break;
        }
      }
    }

  2. #2
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut
    Ma première impression mais c'est peut être une bétise

    Lorsque tu fais un emit, le signal est placé dans une file d'attente avant d'être reçu et d'exécuter le slot.

    Cependant tu détruit l'objet emettant le signal immédiatement après emission de celui-ci, donc si il n'est pas dépilé de la file d'attente avant la destruction de ton thread, il est perdu.

    En effet si il y a destruction d'un des deux objets (emetteur ou receveur) d'un connect, il y a obligatoirement un disconnect de fait.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    L'emit est dans une boucle forever des threads. Le thread n'est pas détruit avant l'émission du signal. Ma log me montre que le code passe plusieurs fois sur l'emit avant la destruction d'un thread.

  4. #4
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Mets plus de traces pour savoir où est l'impasse.

    De plus, cette partie me semble étrange :

    while (threadList.count () > 0) {
    threadList[0]->wait ();
    delete threadList[0];
    threadList.removeFirst ();
    }

    Tu supprimes tout tes threads juste après leur création. De plus, il est mieux de s'assurer qu'un thread soit fini avant de le tuer brutalement.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Quand les threads ont terminé leur travail je les détruits, je ne vois pas le problème.

  6. #6
    Membre averti
    Avatar de Niak74
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    271
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2007
    Messages : 271
    Points : 333
    Points
    333
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for (int i(0) ; i < noeuds ; ++i)
      {
      	Thread * pThread = new Thread(ListeJob, ListeStdOut, ListeStdOut, i);
      	QObject::connect(pThread, SIGNAL(compilationFinished()),this, SLOT(showProgress()));
      	pThread->start();
      	threadList << pThread;
      }  
     
        while (threadList.count () > 0) {
          threadList[0]->wait ();
          delete threadList[0];
          threadList.removeFirst ();
       }
    Description de la fonction wait : http://qt.developpez.com/doc/latest/qthread/#wait

    Tu n'attends pas que les Threads puissent vivre entre les bloc for et while.
    Tu n'attends pas non plus que les Threads se terminent entre le wait et le delete.

    EDIT :

    de plus concernant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    delete ListeJob;
    delete ListeStdOut;
    delete ListeStdErr;
    Il est inutile d'allouter dynamiquement les objets conteneurs de type QList (et donc, QStringList), QVector dans ton cas, et de manière générale.

    Explications : COW http://qt.developpez.com/doc/latest/...ist-of-classes

    Il est aussi très déconseillé d'allouer et de désallouer des variables dans des fonctions différentes (cas ici pour ListeJob).

  7. #7
    Rédacteur

    Avatar de johnlamericain
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    3 742
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 3 742
    Points : 8 140
    Points
    8 140
    Par défaut
    Citation Envoyé par DSGSLA Voir le message
    L'emit est dans une boucle forever des threads. Le thread n'est pas détruit avant l'émission du signal. Ma log me montre que le code passe plusieurs fois sur l'emit avant la destruction d'un thread.
    Je suis d'accord, je pense que le thread n'est pas détruit avant l'emission du signal, mais qu'il est détruit avant la reception

    http://qt.developpez.com/doc/latest/...ctiontype-enum

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 198
    Points : 101
    Points
    101
    Par défaut
    Merci, avec l'option facultative Qt::DirectConnection dans le connect ça marche.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de connection avec phpmyadmin
    Par callo dans le forum Outils
    Réponses: 4
    Dernier message: 20/05/2005, 14h35
  2. Problème de connection
    Par Marsouin dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 17/11/2004, 14h22
  3. [Interbase] Problème de connections
    Par yolepro dans le forum InterBase
    Réponses: 3
    Dernier message: 24/02/2004, 16h31
  4. Problème de connection
    Par Trahwn dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/09/2003, 14h58
  5. problème de connection mysql par tcp/ip
    Par leroyphil dans le forum Administration
    Réponses: 5
    Dernier message: 04/09/2003, 19h27

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