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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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 Expert

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

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

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

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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 Expert

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

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 1 009
    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 éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    508
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Haute Vienne (Limousin)

    Informations forums :
    Inscription : Avril 2008
    Messages : 508
    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 : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    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...

+ 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