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 :

QThread et QProgressBar [QThread]


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 84
    Par défaut QThread et QProgressBar
    Bonjour,

    J'ai un soucis avec QProgressBar, J'aimerais lancer une QProgressBar pendant que mon algorithme fonctionne (un chargement s'affiche), et j'aimerais le faire avec un thread (c'est ce qui me semple juste ). mais ça fonctionne pas,

    bon voila les codes que j'ai utilisée :

    Class_Thread.h
    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
    #ifndef __CLASSE_THREAD_H__
    #define __CLASSE_THREAD_H__
    #include <QThread>
     
    class MyThread : public QThread
    {
    Q_OBJECT
     
    public:
    	MyThread() ;
    	void run();
    	void Start();
    	void Stop();
    	void New ();
    private:
     
    };
     
    #endif // __CLASSE_THREAD_H__
    Classe_Mythread.cpp

    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
    60
    61
    62
    63
    64
    65
    66
    #include "Classe_Thread.h"
    #include "stdio.h"
    #include <QThread>
    #include <QtGui>
     
     
    using namespace QtConcurrent;
     
    const int iterations = 10;
     
    void spin(int &iteration)
    {
        const int work = 1000 * 1000 * 40;
        volatile int v = 0;
        for (int j = 0; j < work; ++j)
            ++v;
     
        //qDebug() << "iteration" << iteration << "in thread" << QThread::currentThreadId();
    }
     
    void MyThread::New ()
    {
     
        // Prepare the vector.
        QVector<int> vector;
        for (int i = 0; i < iterations; ++i)
            vector.append(i);
     
        // Create a progress dialog.
        QProgressDialog dialog;
        dialog.setLabelText(QString("Progressing using %1 thread(s)...").arg(QThread::idealThreadCount()));
     
        // Create a QFutureWatcher and conncect signals and slots.
        QFutureWatcher<void> futureWatcher;
        QObject::connect(&futureWatcher, SIGNAL(finished()), &dialog, SLOT(reset()));
        QObject::connect(&dialog, SIGNAL(canceled()), &futureWatcher, SLOT(cancel()));
        QObject::connect(&futureWatcher, SIGNAL(progressRangeChanged(int,int)), &dialog, SLOT(setRange(int,int)));
        QObject::connect(&futureWatcher, SIGNAL(progressValueChanged(int)), &dialog, SLOT(setValue(int)));
     
        // Start the computation.
        futureWatcher.setFuture(QtConcurrent::map(vector, spin));
     
        // Display the dialog and start the event loop.
        //dialog.exec();
        dialog.exec();
     
        futureWatcher.waitForFinished();
    }
     
    MyThread::MyThread() : QThread()
    {
     
    }
    void MyThread::run()
        {
            New ();
        }
     
        void MyThread::Start()
        {
       	}
     
        void MyThread::Stop()
        {
            win -> close ();
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void MainWindow::on_pushButton_clicked()
    {
    	MyThread* P = new MyThread();
    	P->run ();
    	printf ("Les deux thread fonctionne en parallel \n");
    }
    L'affichage de la chaine "Les deux ...." s'affiche apres la fin d'exéction du message de chargement.

    Merci

  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

    Pourquoi tu as fiat un QThread que tu n'utilise pas
    C'est start qu'il faut utiliser et non run. Par contre; si tu fait cela, tu va avoir un problème car seule le thread Gui peut manipuler les widget.

    Ce que tu as fait est correcte sans le QThread. Ce qui bloque ta fonction c'est l'appel à dialog.exec(); qui attend la fermeture de la dialog avant de continuer.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 84
    Par défaut
    Merci pour la réponse

    comment faire pour remédier à ce probléme de blocage ?

  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
    Citation Envoyé par Hisoka_Hunter Voir le message
    comment faire pour remédier à ce probléme de blocage ?
    En n'appelant pas exec() mais show()

    Ce n'est pas un problème, c'est ce que l'on attend du exec(). Comme une dialog est une widget, tu peut sans problème utiliser show') et ne pas appeler exec().
    Par contre, attention à la porté de tes variable du coup.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 84
    Par défaut
    Merci .

    mais la j'utilise un QProgressDialog, alors il n'y a pas de fonction show . alors la meilleur je pense est de lancer le traitement dans un :

    QFuture<char *> future = QtConcurrent::run(&load, test);

    et lancer apres avec exec, et faire en sorte que dés que la fonction se termine, elle ferme la fenétre (sans utiliser de thread of course).

    exec et sow ça commence à ... :p,

    Es ce possible d'attacher l'avancement de la variable future avec le changement de ProgressBar, ça me semble pas évident mais bon, je pose comméme la question :p.

    Merci

  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 Hisoka_Hunter Voir le message
    Merci .

    mais la j'utilise un QProgressDialog, alors il n'y a pas de fonction show .
    Bien sur que si. Un Dialog est un widget comme un autre.


    Es ce possible d'attacher l'avancement de la variable future avec le changement de ProgressBar, ça me semble pas évident mais bon, je pose comméme la question :p.
    As tu regardé cette exemple http://qt.developpez.com/doc/latest/...essdialog.html

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

Discussions similaires

  1. [QThread] QProcess et QSemaphore
    Par slymira dans le forum Multithreading
    Réponses: 11
    Dernier message: 29/11/2007, 11h40
  2. [QThread] QThread qui fait figger le programme
    Par alpha_one_x86 dans le forum Multithreading
    Réponses: 1
    Dernier message: 29/11/2007, 10h16
  3. [QThread] ne marche pas
    Par alpha_one_x86 dans le forum Multithreading
    Réponses: 11
    Dernier message: 23/11/2007, 09h13
  4. [Thread] QThread et QSocket
    Par G3G3 dans le forum Multithreading
    Réponses: 7
    Dernier message: 30/10/2007, 20h25

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