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 :

Exécution en boucle [QThread]


Sujet :

Multithreading

Mode arborescent

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Exécution en boucle
    Bonjour,

    Je développe actuellement un logiciel de prise de mesure et j'ai un soucis pour l'exécution continue du thread.

    Mon logiciel est construit selon une architecture multi-threadée. Principalement, il dispose d'un thread principal (contenant l'IHM) et d'un thread de mesure.

    Constructeur du thread principal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Manager::Manager(int argv, char* argc[])
    {
         QApplication app(arv, argc);
         m_mesureInterface = new MeasureInterface();
         m_mainGUI = new ClasseHeritantMainWindow();
     
         QObject::connect(m_mainGUI, SIGNAL(startSignal()), m_mesureInterface, SLOT(start()));
         QObject::connect(m_mainGUI, SIGNAL(stopSignal()), m_mesureInterface, SLOT(stop()));
     
         m_mainGUI->show();
         app.exec();
    Et voici une partie du code de la classe de mesure :

    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
    MeasureInterface::MeasureInterface()
    {
         moveToThread(&m_tread);
         m_thread.start();
         QObject::connect(this, SIGNAL(initiateSignal()), this, SLOT(initiate()));
         QObject::connect(this, SIGNAL(nextStep()), this, SLOT(execute()));
         emit initiateSignal();
    }
     
    void MeasureInterface::start()
    {
         m_continue = true;
         execute();
    }
     
    void MeasureInterface::stop()
    {
         m_continue = false;
    }
     
    void MeasureInterface::execute()
    {
         //   Pilotage de l'appareil pour prise de mesure
     
         emit transmitResult(Result res);
     
         if(m_continue)
              emit nextStep();
    }
    Le but de tout ceci est que le thread de mesure doit tourner en continu de façon indépendante, sans jamais être dérangé par l'exécution des autres threads du logiciel. Ma toute première idée avait été une boucle while dans la fonction execute(), mais bien entendu, ce n'est pas possible puisque cela bloque la boucle évènementielle.

    Une autre version, celle actuellement utilisée, envoie au thread principal un signal de résultat, et dès que ce signal est reçu, le thread principal envoie un signal pour rappeler la fonction execute(). Cela fonctionnait bien, mais me pose un problème : si le thread principal est déjà occupé sur une opération longue, le signal est mis en attente et cela bloque le fonctionnement du thread de mesure.

    J'ai donc tenté la solution du code écrit plus haut. A priori, cela fonctionne, mais lorsque j'essaie de stopper l'exécution (par l'envoi du signal stop), tout plante. Ce fonctionnement partiel me laisse penser que l'idée mais est bonne mais que je m'y prend mal.

    Si vous savez ce qui ne colle pas, ou même si vous avez une autre façon de faire à proposer, cela m'aiderait bien.

    Cordialement.
    Dernière modification par Invité ; 06/03/2013 à 17h19.

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

Discussions similaires

  1. Exécuter une boucle à une fréquence donnée.
    Par xoomed dans le forum VB 6 et antérieur
    Réponses: 12
    Dernier message: 05/02/2011, 02h31
  2. Lenteur d'exécution (grande boucle accédant à une dll)
    Par kattig dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 11/09/2010, 21h33
  3. modifier/choisir ordre d'exécution de boucles
    Par blable dans le forum LabVIEW
    Réponses: 1
    Dernier message: 14/06/2010, 21h52
  4. Exécuter une boucle tant que le programme tourne
    Par maxetx dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 14/04/2009, 12h40
  5. exécution de boucle de macro
    Par magicfrom dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 23/04/2008, 16h46

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