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 :

Mon thread s’exécute séquentiellement et pas en parallèle [QThread]


Sujet :

Multithreading

  1. #1
    Membre éclairé Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Par défaut Mon thread s’exécute séquentiellement et pas en parallèle
    Bonjour à tous,

    j'essai de réaliser ce qui suit : lorsque je clique sur un bouton, celui-ci devient gris (setEnabled(false)), puis un traitement sera effectué, et enfin le bouton redevient accessible (setEnabled(true)) :
    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
    void MainWindow::onSketchingBtnClick() {
            // Classe qui dérive de QThread
    	class OnSketchingBtnClick : public QThread {
    	public:
    		void run() {
                            // Traitement
                            processing();
                            // Rendre le bouton accessible de nouveau
    			button->setEnabled(true);
    			exec();
    		}
    	};
     
            // Rendre le bouton inaccessible
    	button->setEnabled(false);
     
            // Lancer le traitement dans un thread
    	OnSketchingBtnClick *thread = new OnSketchingBtnClick(this);
    	thread->start();
            cout << "done.." << endl;
    }
    Le problème c'est que je note pas l’exécution de la méthode setEnabled(true). C'est comme si l’exécution était séquentielle : le message de cout n'est affiché qu’après la fin du traitement tout comme le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Rendre le bouton inaccessible
    button->setEnabled(false);
    // Traitement
    processing();
    cout << "done.." << endl;
    // Rendre le bouton accessible de nouveau
    button->setEnabled(true);
    Quelqu'un a-t-il une explication ? Merci d'avance,
    Chatbour.

  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


    ca compile ton code???

    Je te conseille de commencer par un petit tour sur la FAQ
    http://qt.developpez.com/faq/?page=Thread

  3. #3
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    Comme Yan je comprend pas du tout ce que tu as fais...
    Avec un peu plus d'info et un code plus propre on devrait pouvoir t'aider.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  4. #4
    Membre éclairé Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Par défaut
    désolé en fait dans le code que j'ai fourni j'ai supprimé quelques informations afin de rendre le code plus clair, mais appariement j'ai causé le contraire. Voici le code original :
    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
    void MainWindow::onSketchingBtnClick() {
            // Classe qui dérive de QThread
    	class OnSketchingBtnClick : public QThread {
                    MainWindow *window;
    	public:
                    OnSketchingBtnClick (MainWindow *window) {
                            this->window = window;
    		}
    		void run() {
                            // Traitement
                            windows->processing();
                            // Rendre le bouton accessible de nouveau
    			windows->button->setEnabled(true);
    			exec();
    		}
    	};
     
            // Rendre le bouton inaccessible
    	button->setEnabled(false);
     
            // Lancer le traitement dans un thread
    	OnSketchingBtnClick *thread = new OnSketchingBtnClick(this);
    	thread->start();
            cout << "done.." << endl;
    }
    ce que je fais c'est déclarer une classe qui dérive de QThread afin d'y mettre le code que je veux exécuter en parallèle (esprit "javaïste" ^^).

  5. #5
    Rédacteur

    Inscrit en
    Novembre 2006
    Messages
    1 272
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 272
    Par défaut
    en gros pour moi un truc propre serait de bien deja declarer un thread dans un .h et un Cpp.

    De plus au niveau du code de ta fonction je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void MainWindow::onSketchingBtnClick() 
    {
            // Rendre le bouton inaccessible
    	button->setEnabled(false);
     
            // Lancer le traitement dans un thread
           //Attention ici tu as une fuite mémoire il faut mettre la variable thread en variable membre
    	OnSketchingBtnClick *thread = new OnSketchingBtnClick(this);
            //Ici je ferai un connect avec un slot perso genre updateBtn() comme ci dessous
    connect(.....);
    	thread->start();
     
    }
    Slot personalisé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void MainWindow::updateBtn() 
    {
    button->setEnabled(true);
    }
    Pour ce qui est de la methode run je la definirai comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void run() {
                            // Traitement
                            processing();
    //signal qui devra etre connecté au slot updateBtn() avant la lancement du thread 
    emit refreshBtn();
     
    }
    Je ne sais pas si ce code compile en l’état c'est juste en gros le raisonnement que j'aurai si je devais faire ton truc.
    Vous voulez participer aux Tutoriels, FAQ ou Traductions et faire partie de l'équipe Qt de Developpez.
    N'hésitez pas à me contacter par MP.

  6. #6
    Membre éclairé Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 431
    Par défaut
    je vois..
    merci beaucoup superjaja

  7. #7
    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 Chatbour Voir le message
    esprit "javaïste" ^^
    je m'en doutais ^^
    Juste pour compléter ce qu'as dit superjaja, il ne faut surtout pas utiliser des méthodes IHM dans un thread
    http://qt.developpez.com/faq/?page=Thread#ihm-thread

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

Discussions similaires

  1. probleme : mon 2eme thread ne s'active pas.
    Par cosmoff dans le forum Général Python
    Réponses: 1
    Dernier message: 26/05/2015, 01h12
  2. Pourquoi mon Thread ne marche pas ?
    Par Cazaux-Moutou-Philippe dans le forum Delphi
    Réponses: 9
    Dernier message: 27/05/2007, 16h19
  3. [JApplet]mon applet ne s'affiche pas.
    Par yannick56 dans le forum Applets
    Réponses: 6
    Dernier message: 27/05/2004, 17h05
  4. Mon script cron n'est pas pris en compte
    Par tomnie dans le forum Linux
    Réponses: 11
    Dernier message: 31/03/2004, 11h19
  5. j'arrive pas a arreter mon thread d'arriere-plan
    Par ms91fr dans le forum Langage
    Réponses: 6
    Dernier message: 06/06/2003, 21h36

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