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 :

comment lancer un programme dans un nouveau thread


Sujet :

Multithreading

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Par défaut comment lancer un programme dans un nouveau thread
    Bonjour à tous,

    J'ai créer un petit programme en C++ et je l'ai interfacé avec Qt.
    De manière synthétique, j'ai un bouton qui lance un algo. J'aimerais le lancer dans un thread différent de l'IHM pour éviter de "freezer" mon interface. J'ai fait une recherche sur Google et j'ai découvert QtConcurrent::run qui semble faire ce que je veux (voir ici). Cependant lorsque je lance ma fenêtre et que je clique sur mon bouton, j'obtiens un "RunTime Error".

    Voici un résumé de mon code :

    Voici mon header :
    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
     
    #ifndef FENPRINCIPALE_H
    #define FENPRINCIPALE_H
     
    #include <QPushButton>
    #include <QApplication>
    #include <QtGui>
    #include <QLabel>
    #include <QThread>
    #include <QtConcurrentRun>
    #include <QFuture>
    #include <QFutureWatcher>
     
    class FenPrincipale : public QMainWindow
    {
         Q_OBJECT
     
         public:
            // Constructeur
            FenPrincipale();
     
            // Attributs
            QPushButton *bouton1;
     
            // Methodes
            void algo();
     
        // Slots
        public slots:
            void SlotAlgo();
    };
    #endif // FENPRINCIPALE_H
    Voici mon .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
     
    #include "FenPrincipale.h"
     
    FenPrincipale::FenPrincipale()
    {
    bouton1 = new QPushButton("Lancer algo");
    QObject::connect(bouton1, SIGNAL(clicked()),this, SLOT(SlotAlgo()));
    }
     
    void FenPrincipale::algo()
    {
       // time-consuming code
       double sum;
       for (int i=1; i<100000; i++)
       {
          for (int j=1; j<100000; j++)
          {
             sum = sum * i / j;
          }
       }
    }
     
    void FenPrincipale::SlotAlgo()
    {
        QFuture<void> future=QtConcurrent::run(this,&FenPrincipale::algo);
        future.waitForFinished();
    }

    Pouvez-vous me dire s'il y a une erreur que je ne vois pas, notamment dans FenPrincipale::SlotAlgo() ?
    Merci d'avance pour votre patience et votre aide .

  2. #2
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    http://qt.developpez.com/faq/?page=Thread devrait t'être d'une grande aide

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 18
    Par défaut
    Merci mais ce que je cherche, c'est une explication simple de la manière dont fonctionne QtConcurrent (et surtout la méthode run) pour ensuite pouvoir comprendre et débugger ce que j'ai écrit. J'ai déjà lu et essayé d'appliquer ce qui est indiqué dans la doc de Qt mais je n'y parviens pas.

  4. #4
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Pourquoi ne pas hériter de QThread et implémenter run() pour qu'elle réalise ton algo ?

  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
    Citation Envoyé par Yihaa Voir le message
    Pouvez-vous me dire s'il y a une erreur que je ne vois pas, notamment dans FenPrincipale::SlotAlgo() ?
    Merci d'avance pour votre patience et votre aide .
    C'est ce code qui plante???
    Le seule problème que je vois c'est que tu utilise une fonction de ton QObject dans la thread. Car un QObject n'est pas prévue pour être utilisé par plusieurs thread en même temps. Mais comme tu n'utilise rien de la classe, y as pas de raison que cela plante.

    Et attention, future.waitForFinished() est bloquante. Pour ne pas freezer l'ihm, utilise un QFutureWatcher et s'il faut une eventloop locale.

    Citation Envoyé par Alp Voir le message
    Pourquoi ne pas hériter de QThread et implémenter run() pour qu'elle réalise ton algo ?
    Pourquoi s'embêter à faire une thread si on peut éviter
    Après faut voir ce qu'il veut vraiment faire bien sure.

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Citation Envoyé par yan Voir le message
    Pourquoi s'embêter à faire une thread si on peut éviter
    Après faut voir ce qu'il veut vraiment faire bien sure.
    Bah si l'algo calcule quelque chose, j'verrais bien un slot dans sa fenêtre principale qui serait appelé quand le calcul est fini, prenant en argument le résultat, et l'affichant dans sa fenêtre principale (je suppose).

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

Discussions similaires

  1. Lancer un form dans un nouveau thread
    Par Colbix dans le forum Langage
    Réponses: 2
    Dernier message: 23/04/2010, 13h25
  2. Réponses: 2
    Dernier message: 27/12/2005, 11h47
  3. Comment lancer un programme au démarrage de Windows ?
    Par nesquik dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 29/07/2005, 17h48
  4. Comment lancer une erreur dans une procédure stockée
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/05/2005, 17h06
  5. Réponses: 8
    Dernier message: 05/06/2002, 11h55

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