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 Problème avec un QTimer


Sujet :

Qt

  1. #1
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Par défaut Qt Problème avec un QTimer
    Bonjour, j'ai une question en ce qui concerne un QTimer

    J'ai une Combo qui contient des string "1 seconde", "5 secondes", "10 secondes" etc...
    J'aimerai qu'en selectionnant un autre texte dans la Combo, l'intervalle du Qtimer change conformément à la fonction fixInterval()
    La fonction reLoad lit les données des différents fichiers et les affiche dans des QSpinBox.

    Si on change les données des QSpinBox sans les sauvegarder, j'aimerai que les anciennes données soient à nouveau affichées selon les différents intervalles.

    Mais en fait je n'arrive pas à faire relire les données après que l'intervalle se soit ecoulé...

    Les fonctions lireFichierCcDoss(), lireFichierClientFolder(), lireFichierAdobe(), lireFichierDI()fonctionnent car elles sont également lancées lors de l'exécution de l'application. De plus je n'ai aucune erreur lors de la compilation, mon application démarre correctement.

    Voilà le bout de code.

    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
    connect(tempsCombo, SIGNAL(currentIndexChanged()),this, SLOT(fixInterval()));
    connect(timer, SIGNAL(timeout()), this, SLOT(reLoad()));
     
    void FixWindows::fixInterval()
    {
        QString text = tempsCombo->currentText();
     
        if (text =="1 seconde")
            {
                timer->setInterval(1000);
                timer->start(1000);
            }
     
        else if (text =="5 secondes")
            {
                timer->setInterval(5000);
                timer->start(5000);
            }
    } 
     
    void FixWindows::reLoad()
    {
        lireFichierCcDoss();
        lireFichierClientFolder();
        lireFichierAdobe();
        lireFichierDI();
    }

    Je vous remercie d'avance

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Salut à toi,

    Il y a 9 chances sur 10 que ça soit un problème d'EventLoop. Je t'invite à lire de la doc là dessus, si ce n'est pas déjà fait. Est une application multithread ?

    Sinon, je ne connais pas vraiment les timers, mais voici d'autres pistes :

    As tu vraiment vérifier que ton timeout() n'est pas émis ? Tu pourrais vérifier avec qDebug par exemple. Tes fonctions Lirexxx marchent peut être une fois, et si tu oublie de réinitialiser certaines données, il se peut qu'elles soient appelées, mais que ton résultat soit toujours le même que le résultat initial.

    Sinon, peut être qu'il faut stopper le timer avec stop() avant de le relancer avec une autre période. Et en passant, il est inutile d'utiliser setInterval(x), si tu mets la durée en argument du start.

    Bonne chance,

    G.

  3. #3
    Membre habitué
    Inscrit en
    Août 2008
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 9
    Par défaut
    Salut

    Merci pour les propositions, mais ça n'a rien changé.
    J'ai changé un peu le code et ça marche a peu près comme je veux.

    Voilà ce que j'ai fait.

    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
     
     
    connect(timer, SIGNAL(timeout()), this, SLOT(reLoad()));
     
    void FixWindows::reLoad()
    {
        QString text = tempsCombo->currentText();
     
        if (text =="1 seconde")
            {
                timer->stop();
                timer->start(1000);
            }
     
        else if (text =="5 secondes")
            {
                timer->stop();
                timer->start(5000);
            }
     
        else if (text =="10 secondes")
            {
                timer->stop();
                timer->start(10000);
            }
     
        else if (text =="30 secondes")
            {
                timer->stop();
                timer->start(30000);
            }
     
        lireFichierCcDoss();
        lireFichierClientFolder();
        lireFichierAdobe();
        lireFichierDI();
    }
    au lieu de :

    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
     
     
    connect(tempsCombo, SIGNAL(currentIndexChanged()),this, SLOT(fixInterval()));
    connect(timer, SIGNAL(timeout()), this, SLOT(reLoad()));
     
    void FixWindows::fixInterval()
    {
        QString text = tempsCombo->currentText();
     
        if (text =="1 seconde")
            {
                timer->stop();
                timer->start(1000);
            }
     
        else if (text =="5 secondes")
            {
                timer->stop();
                timer->start(5000);
            }
     
        else if (text =="10 secondes")
            {
                timer->stop();
                timer->start(10000);
            }
     
        else if (text =="30 secondes")
            {
                timer->stop();
                timer->start(30000);
            }
    } 
     
    void FixWindows::reLoad()
    {
        lireFichierCcDoss();
        lireFichierClientFolder();
        lireFichierAdobe();
        lireFichierDI();
    }
    J'ai fait en mélange des deux fonctions, le seul inconvénient c'est que si je mets la combo à 30 sec, et que je rechange sur 1 seconde, il faut d'abord attendre que les 30 sec précédentes soient écoulées.

    En fait le problème que je n'ai pas réussi à résoudre c'est le Signal currentIndexChanged, il n'y avait pas de connection. C'est pourquoi j'ai fait un mélange des deux fonctions.

    Merci quand même pour l'aide

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Par défaut
    Y'a la méthode killTimer, jamais testée.

    http://qt.developpez.com/doc/4.4/qobject/#killtimer

    Mais obn, ça peut valoir le coup de jeter un oeil.

    Bon courage,

    G.

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

Discussions similaires

  1. Problème avec QTimer
    Par Aure7780 dans le forum Qt
    Réponses: 22
    Dernier message: 08/06/2010, 15h01
  2. Problème avec QTimer
    Par crazy_inf dans le forum Qt
    Réponses: 1
    Dernier message: 06/04/2010, 10h51
  3. [QThread] Problème avec QTimer et QThread
    Par scary dans le forum Multithreading
    Réponses: 7
    Dernier message: 15/12/2009, 18h00
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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