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 :

Un QThread avec boucle infinie


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut Un QThread avec boucle infinie
    Bonjour,
    J'aimerais savoir quelle serait le code pour faire en sorte qu'une QProgressBar puisse s'activer (valeur modifiée) pendant qu'une autre tâche s'effectue dans le main (une tâche assez longue) ?
    Il faudrait que l'application soit ne soit pas "freezé" (le but des QThreads), mais quand j'enlève le "QCoreApplication::processEvents();", mon application se freeze...

    Voici le code (que je pense est incorrecte quelque part car je n'ai jamais utilisé QThread et je n'ai pas trouvé de documentation appropriée dans mon cas à part des forums) :
    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
    #ifndef DEF_Q_S_THREAD_HPP
    #define DEF_Q_S_THREAD_HPP
     
    #include <QApplication>
    #include <QCoreApplication>
    #include <QThread>
    #include <QWaitCondition>
     
    class QSThread : public QThread
    {
        Q_OBJECT
     
        public:
     
            // Constructeur/Destructeur
            QSThread(QObject *parent = 0);
            ~QSThread();
     
            // -----------------------------------------------------------------------------------------------------------------
     
            // Méthode de lancement
            void run();
     
     
        private:
     
            // Attributs privés
            int m_value;
            QWaitCondition m_wait_condition;
     
     
        signals:
     
            // Signal qui modifie la progression de la progressBar
            void setValue(int value);
    };
     
    #endif //DEF_Q_S_THREAD_HPP
    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
    #include "QSThread.hpp"
     
    // Constructeur
    QSThread::QSThread(QObject *parent) : QThread(parent)
    {
        // initialisation de l'attribut m_valeur
        m_value = 0;
    }
     
    // Destructeur
    QSThread::~QSThread()
    {}
     
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
     
    // Méthode de lancement
    void QSThread::run()
    {
        while(1)
        {
            m_value += 5;
            //m_mutex.unlock();
     
            // vérification de la nouvelle valeur
            if(m_value >= 100)
                m_value = 0;
     
            // changement de valeur
            emit setValue(m_value);
            QCoreApplication::processEvents();
            m_wait_condition.wait();
        }
    }

    et voici la progressBar :
    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
    #ifndef DEF_Q_S_PROGRESS_BAR_HPP
    #define DEF_Q_S_PROGRESS_BAR_HPP
     
    #include <QProgressBar>
    #include "QSThread.hpp"
     
    class QSProgressBar : public QProgressBar
    {
        Q_OBJECT
     
        public:
     
            // Constructeur/Destructeur
            QSProgressBar(QWidget *parent = 0);
            ~QSProgressBar();
     
            // -----------------------------------------------------------------------------------------------------------------
     
            // Méthodes de lancement de chargement
            void startLoading();
            void stopLoading();
     
        private:
     
            // Thread principale
            QSThread m_thread;
    };
     
    #endif //DEF_Q_S_PROGRESS_BAR_HPP
    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
    #include "QSProgressBar.hpp"
     
    // Constructeur
    QSProgressBar::QSProgressBar(QWidget *parent) : QProgressBar(parent)
    {
        // configuration de la progressBar
        setValue(0);
        setTextVisible(false);
     
        // connexion des signaux
        connect(&m_thread, SIGNAL(setValue(int)), this, SLOT(setValue(int)));
    }
     
    // Destructeur
    QSProgressBar::~QSProgressBar()
    {}
     
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
    // -------------------------------------------------------------------------------------------------------------------------------------------------
     
    // Met en route le chargement
    void QSProgressBar::startLoading()
    {
        m_thread.start(QThread::HighestPriority	);
    }
     
    // Stoppe le chargement
    void QSProgressBar::stopLoading()
    {
        m_thread.exit();
        setValue(0);
    }

  2. #2
    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.
    Pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    QCoreApplication::processEvents();
    m_wait_condition.wait();

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 204
    Par défaut
    Mais moi non plus je comprends pas pourquoi je le mets -_-'
    Je le mets parce que l'application se gèle quand même...

    Elle se gèle et ne remplit pas la QProgressBar...
    Vous n'avez pas un code ou un exemple d'un thread qui a pour tâche de rempli/vider/remplir... une QProgressBar pendant une tâche ?

    Merci d'avance !
    (PS : même après avoir lu la documentation de QT et des posts dont le sujet ressemblent au mien sur les threads, je ne sais toujours pas comment l'assimiler à mon cas)

  4. #4
    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
    Pourtant ton code semble bon
    QUe veut tu dire par gelé? tu pourais mettre le code du main?

  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
    a copier dans main.cpp puis
    qmake -project
    qmake
    make (ou anmake si tu utilise visual)

    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
    #include <QtGui>
     
    class myTHread:public QThread
    {
    Q_OBJECT
    public :
    	int m_value;
    	void run()
    	{
    	forever
    		{
    		m_value=(m_value+1)%101;
    		msleep(100);
            emit value(m_value);
    		}
    	}
    signals :
    	void value(int);
    };
    #include "main.moc"
     
     
    int main(int argc,char ** argv)
    {
    	QApplication app(argc,argv);
     
    	myTHread t;
    	t.start();
    	QProgressBar bar;
    		QObject::connect(&t,SIGNAL(value(int)),& bar,SLOT(setValue(int)));
    	bar.show();
    return app.exec();
    }

  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
    je vien de comprendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while(1)
        {
            m_value += 5;
            //m_mutex.unlock();
     
            // vérification de la nouvelle valeur
            if(m_value >= 100)
                m_value = 0;
     
            // changement de valeur
            emit setValue(m_value);
        }
    ca va beaucoup trop vite,tu envoie beaucoup trop de signal, ton ihm n'as plis de temps de faire autre chose!!!!
    utilise au moins un tempo comme msleep ou autre pour simuler une action longue

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

Discussions similaires

  1. [QThread] Commencer avec QThread et une boucle infinie
    Par FoX_*D i E* dans le forum Multithreading
    Réponses: 1
    Dernier message: 18/02/2014, 23h24
  2. Pb flush avec "boucle infinie" et pipe
    Par mcoolive dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/10/2008, 10h19
  3. Boucle infinie ou avec contraintes
    Par feynman dans le forum Fortran
    Réponses: 2
    Dernier message: 24/07/2007, 11h28
  4. problème avec les boucle infinies
    Par manciaux dans le forum C
    Réponses: 3
    Dernier message: 14/05/2007, 12h16
  5. [JMeter] Problème avec la boucle infinie pour les tests
    Par zegreg dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 05/10/2005, 11h41

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