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 :

Sleep sans bloquer le programme Qt ?


Sujet :

Qt

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Par défaut Sleep sans bloquer le programme Qt ?
    Salut à tous,

    Je veux faire un décompte genre un compte à rebour voici la compétence que j'appel lorsque je clic sur le bouton d'activation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Fen::on_pushButton_clicked()
    {
    	for(int i=9;i>=0;i--)
    	{
    		sleep(1);
    		ui.lcdNumber->setProperty("intValue", QVariant(i));
    	}
    }
    Or lorsque je clic sur le bouton le programme se fige pendant 10 sec car mon décompte démarre avec une valeur i = 10. Une fois les 10 sec écoulé 0 s'affiche à l'écran.
    Cela passe de 10 à 0 d'un coup.
    Or j'aimerai que toutes les secondes s'affiche dans la fenetre aidez moi svp ?

    ++

    Barbuslex.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Soit Qt a déjà un mécanisme de timers et tu l'utilises, soit tu fais un autre thread.

  3. #3
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Sous Qt, tu dispose de la classe QTimer qui permet de travailler de manière non bloquante...

    Pour le reste, je vais te laisser chercher comment faire ce que tu souhaite...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  4. #4
    Membre averti
    Inscrit en
    Août 2008
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 25
    Par défaut
    regarde la, tu trouveras ce que tu recherches, avec des explications...

    http://sector.ynet.sk/qt4-tutorial/threads.html

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Salut
    une thread??? pour faire cela???
    pour cela il faut mieux que tu utiliser un QTimer et les signal/slot.
    Pour le QTimer, je te laisse regarder la doc
    pour les signal/slot je te laisse regarde la FAQ et les tuto

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par alainstgt Voir le message
    regarde la, tu trouveras ce que tu recherches, avec des explications...
    http://sector.ynet.sk/qt4-tutorial/threads.html
    Je viens de regarder.... le code du run est moyen...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            #ifdef Q_OS_WIN32
            t = t * 1000;
            _sleep(t);
            #else
            sleep(t);
            #endif
    Qthread fourni déjà des sleep :
    http://qt.developpez.com/doc/4.4/qthread/#msleep
    http://qt.developpez.com/doc/4.4/qthread/#sleep
    http://qt.developpez.com/doc/4.4/qthread/#usleep

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void MyThread::run()
    {     
        for(int i=0;i<10;i++)
        {
            ...
     
        }   
        exec();
    }
    Pourquoi lancer l'eventloop?????
    à par pour se retrouver avec une thread qui ne faite rien....

    les autres tuto semblent bien, mais celui-ci est très moyen... surtout pour un débutant...

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Par défaut
    La fonction sleep() que j'appel dans mon code est en fait celle de Qthread.

    QThread::sleep();

    Je débute dans le code et j'aimerais savoir comment peut on utiliser les classes tels que le timer ou autre dans mon exemple car je ne m'en sort pas.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par barbuslex Voir le message
    La fonction sleep() que j'appel dans mon code est en fait celle de Qthread.

    QThread::sleep();

    Je débute dans le code et j'aimerais savoir comment peut on utiliser les classes tels que le timer ou autre dans mon exemple car je ne m'en sort pas.
    Un QTimer va émettre un signal timeout à temps régulier. Il te suffit de connecter un slot dessus.
    Qu'elle est la partie qui te pose problème?

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Par défaut
    Le principe du timer j'avais compris mais en fait je n'ai pas l'habitude de programmer des ui avec QT et donc cela me pose quelques problème.

    En fait j'aimerais arrivé a ce que j'ai di au début du sujet faire un décompte.
    Y aurait il un exemple à partir de mon code que vous pouvez me fournir afin que je comprenne mieu ?

    Merci d'avance,
    ++

    Barbuslex.

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par barbuslex Voir le message
    En fait j'aimerais arrivé a ce que j'ai di au début du sujet faire un décompte.
    Y aurait il un exemple à partir de mon code que vous pouvez me fournir afin que je comprenne mieu ?
    .
    Avant
    quel partie ne comprend tu pas?
    Qu'es ce qu'un connect et signal/slot?
    Ce que fait QTimer?
    Comment se déroule l'exécution au travers d'une event loop?

  11. #11
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2006
    Messages
    519
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2006
    Messages : 519
    Par défaut
    Il y a une autre possibilité que les Timers qui consiste à appeler, à chaque itération de la boucle,

  12. #12
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par spidermario Voir le message
    Il y a une autre possibilité que les Timers qui consiste à appeler, à chaque itération de la boucle,
    pour ce qu'il veut faire c'est très bof...

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 77
    Par défaut
    Ben en théorie j'avais compris mais voilà c'est juste que j'aimerais savoir dans le code que j'ai donné comment appelé cette classe timer.

  14. #14
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par barbuslex Voir le message
    Ben en théorie j'avais compris mais voilà c'est juste que j'aimerais savoir dans le code que j'ai donné comment appelé cette classe timer.


    bon voici un exemple. Le timer emet un signal à temps régulier et je rafraichie l'affichage à ce moment.
    Si le compteur est à zéro, j'arrête le timer

    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
    54
    55
    56
    57
    58
    59
    #include <QtGui>
     
    class mCompteur :public QWidget
    {
        Q_OBJECT
        int m_depard;
        int m_id;
        QTimer m_timer;
        QLCDNumber * m_affichage;
        QPushButton * m_bStart;
    public  :
        mCompteur( int depard)
        :m_depard(depard),
        m_affichage(new QLCDNumber),
        m_bStart( new QPushButton("start"))
        {
            m_affichage->setSegmentStyle (QLCDNumber::Flat);
            QLayout * l = new QVBoxLayout;
            {
                l->addWidget(m_affichage);
                l->addWidget(m_bStart);
            }
            setLayout(l);
     
            connect(m_bStart,SIGNAL(clicked (bool)),this,SLOT(start()));
            connect(&m_timer,SIGNAL(timeout()),this,SLOT(decompte()));
        }
    private slots:
        void start()
        {
            m_id = m_depard;
            m_affichage->display(m_id);
            m_bStart->setEnabled(false);
            m_timer.start(1000);
        }
     
         void decompte()
        {
              --m_id;
             m_affichage->display (m_id);
     
             if (m_id == 0)
             {
                m_bStart->setEnabled(true);
                m_timer.stop();
             }
        }
    };
     
     
     
    #include "main.moc"
    int  main(int argc,char**argv)
    {
        QApplication app(argc,argv);
        mCompteur w(10);
        w.show();
        return app.exec();
    }

Discussions similaires

  1. Get sans "bloquer" le programme principal.
    Par saezir dans le forum Ada
    Réponses: 3
    Dernier message: 06/03/2010, 16h22
  2. Détection de touches sans bloquer le programme
    Par DJ-sauron dans le forum Windows Forms
    Réponses: 6
    Dernier message: 03/11/2008, 09h52
  3. Réponses: 6
    Dernier message: 14/06/2007, 23h22
  4. Fermer la fentre sans quitter le programme?
    Par tomburn dans le forum OpenGL
    Réponses: 13
    Dernier message: 06/12/2004, 17h02
  5. [Turbo Pascal] Lire une touche au clavier sans interrompre le programme
    Par Allelouia dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 29/03/2003, 22h31

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