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

Multithreading Discussion :

Problème d'appel d'un slot dans un QThread


Sujet :

Multithreading

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut Problème d'appel d'un slot dans un QThread
    Bonjour à tous,

    dans mon application avec QtCreator, je démarre un QThread quand j'appui sur un bouton et ça pas de problèmes mais dans ma méthode run() de mon QThread, je démarre un timer et j'ai fait appel à un slot lorsque le timer est fini.
    Lorsque le timer est fini, l'appel au slot ne se fait pas !!!

    Méthode run() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void ThreadSaveData::run()
    {
    TimerSave = new QTimer(this);
    TimerSave->setSingleShot(false);
    connect(TimerSave, SIGNAL(timeout()), this, SLOT(RecupDataToSave()));
    UpdateSave = StringListRequeteCom.at(0).toDouble() * 2000;
    TimerSave->start(UpdateSave); // Xms timeout
    }

  2. #2
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Et le slot ThreadSaveData::RecupDataToSave() que tu connectes, il existe ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    oui, il existe !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void ThreadSaveData::RecupDataToSave()
    {
    ...
    }
    Je l'ai déclaré dans private slots dans mon .h .

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Le code est pas long, tu pourrais t'en sortir seul étant donné que y'a pas de souci particulier avec un connect dans un QThread.

    StringListRequeteCom.at(0).toDouble() renvoie une bonne valeur ? Est-ce que ça marche si tu mets une valeur en dur à la place de UpdateSave (qu'il faudrait vérifier) ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    J'ai mis une valeur en dur (5000) donc quand le timer est fini au bout de 5 secondes ça devrait appeler mon slot "RecupDataToSave()" ?
    Cela ne change rien !!!

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Lorsque le timer est fini, l'appel au slot ne se fait pas
    Comment sais tu que le timer est fini ? Juste le temps écoulé ou tu as un autre slot qui te prévient ?
    Comment testes tu que le slot n'est pas appelé ? Avec un qDebug() ou équivalent ?

    Pour les threads, il est bien de donner aussi le code de déclaration du ThreadSaveData et de la création de l'objet.

    Sinon, en première lecture, il y a 2 problèmes dans ton code :
    - ThreadSaveData appartient au thread principal donc mettre this comme parent du QTimer fait que QTimer appartient aussi au thread principal
    - tu lances pas exec() dans run() donc tu lances jamais ta boucle d'event du thread secondaire
    En d'autres mots, ton thread ne sert à rien

    De plus, pour ce genre de chose, tu devrais regarder du côté de QtConcurrent, ça devrait simplifier ta vie (si utilisable)

    Pour terminer, il existe des tutos sur les threads de Qt en français, il suffit de cliquer sur le gros bouton "Tutoriels Qt" en haut de cette page...

  7. #7
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    Points : 1 738
    Points
    1 738
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Sinon, en première lecture, il y a 2 problèmes dans ton code :
    - ThreadSaveData appartient au thread principal donc mettre this comme parent du QTimer fait que QTimer appartient aussi au thread principal
    - tu lances pas exec() dans run() donc tu lances jamais ta boucle d'event du thread secondaire
    En d'autres mots, ton thread ne sert à rien
    ThreadSaveData c'est son QThread, il a du faire "start()" depuis le thread principal, ce qui exécute le run(). Pour ton premier point, c'était le but de ma question sur l'existence de la méthode, vu que les débutant font souvent l'erreur de faire connect avec "this" en récepteur (copier-coller malheureux).
    Je pense donc que son implémentation de thread fonctionne (même si elle est déconseillée).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    Bonjour,

    J'ai bien lu la FAQ et j'ai rajouté exec() et maintenant tout fonctionne !
    Merci pour votre aide.

    Je pense donc que son implémentation de thread fonctionne (même si elle est déconseillée).
    J'aimerai quand même comprendre qu'est ce qui ne va pas dans l'implémentation de mon thread et ce que vous me conseillerai.

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Citation Envoyé par Troudhyl Voir le message
    ThreadSaveData c'est son QThread, il a du faire "start()" depuis le thread principal, ce qui exécute le run(). Pour ton premier point, c'était le but de ma question sur l'existence de la méthode, vu que les débutant font souvent l'erreur de faire connect avec "this" en récepteur (copier-coller malheureux).
    Je pense donc que son implémentation de thread fonctionne (même si elle est déconseillée).
    Pour les connexions signaux-slots entre threads, les signaux passent par la boucle d'event donc il faut que celle ci soit tourne, donc il ne faut pas oublier le exec()

    Citation Envoyé par petitclem Voir le message
    J'aimerai quand même comprendre qu'est ce qui ne va pas dans l'implémentation de mon thread et ce que vous me conseillerai.
    Citation Envoyé par gbdivers Voir le message
    Pour terminer, il existe des tutos sur les threads de Qt en français, il suffit de cliquer sur le gros bouton "Tutoriels Qt" en haut de cette page...

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    Points : 100
    Points
    100
    Par défaut
    OK, merci beaucoup à tous pour votre aide.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 18/02/2015, 22h44
  2. Problème d'appel de fonction js dans une page asp.net
    Par diablerouge2000 dans le forum Développement Web avec .NET
    Réponses: 0
    Dernier message: 27/01/2014, 12h26
  3. [Lazarus] Problème d'appel d'une procédure dans une DLL
    Par ChPr dans le forum Lazarus
    Réponses: 10
    Dernier message: 20/09/2011, 11h17
  4. Réponses: 2
    Dernier message: 24/03/2009, 09h09
  5. Réponses: 7
    Dernier message: 12/03/2006, 21h18

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