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 :

Terminer proprement un thread


Sujet :

Multithreading

  1. #1
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut Terminer proprement un thread
    Bonjour,
    je m'appuie sur l'article https://mayaposch.wordpress.com/2011...l-explanation/ pour travailler sur les threads dans Qt.
    Dans mon application, un thread secondaire reçoit des données du réseau et doit mettre à jour l'IHM.
    Dans un premier temps, mon appli "test unitaire" fonctionne correctement (mise à jour périodique d'un label sur l'ihm) mais je n'arrive pas à stopper proprement le thread à l'appui sur un bouton stop.
    Code côté thread principal:
    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
    //Gestion sur le clic du bouton start
    void MainWindow::start_thread()
    {
        QThread* thread = new QThread;
        WorkerThread* worker = new WorkerThread();
        worker->moveToThread(thread);
        //connecter le signal plus du worker au slot plus de mainWindow pour rafraîchir l'ihm
        connect(worker, SIGNAL(plus()), this, SLOT(plus()));
        connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
        //Qd le thread démarre, il démarre le workerthread
        connect(thread, SIGNAL(started()), worker, SLOT(process()));
        //Qd le workerthread s'arrête, il stoppe le thread
        connect(worker, SIGNAL(finished()), thread, SLOT(quit()));
        connect(worker, SIGNAL(finished()), worker, SLOT(deleteLater()));
        connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater()));
    
        //c'est ce connect qui ne semble pas fonctionner...
        connect(this, SIGNAL(stopThread()), worker, SLOT(running()));
    
        thread->start();
    }
    
    // Clic sur le bouton stop. Stop le thread démarré par start_thread().
    void MainWindow::stop_thread()
    {
        emit stopThread();
    }
    Code côté thread secondaire:
    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
     
    //le job dans le thread
    void WorkerThread::process()
    {
        while(continuer == true)
        {
            emit plus();    //destination du thread ui pour rafraîchissement
            QThread::sleep(1);
        }
        emit finished();    //à destination du QThread
    }
     
    //connectée au signal stopThread du thread ui
    void WorkerThread::running()
    {
        continuer = false;
    }
    Je pense que le signal stopThread est émit mais à priori je ne passe jamais dans la méthode running().
    Si vous voyez d'où vient le problème, merci.

  2. #2
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    je remarque que dans le sens worker --> thread principal, ça fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    connect(worker, SIGNAL(plus()), this, SLOT(plus()));
    connect(worker, SIGNAL(error(QString)), this, SLOT(errorString(QString)));
    Mais dans le sens contraire, il y a problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    connect(this, SIGNAL(stopThread()), worker, SLOT(running()));
    Etrange.

  3. #3
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    289
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2008
    Messages : 289
    Points : 151
    Points
    151
    Par défaut
    Bonjour,
    finalement il n'y avait peut être pas très loin à chercher.
    Depuis le thread principal, j'appelle la méthode running() du worker et apparemment tout s'arrête correctement.
    Je ne comprend pourquoi on ne peut pas ça par le mécanisme signal/slot et ça me dérange un peu.
    Je continue mon projet mais je laisse cette discussion ouvert au cas où quelqu'un aurait la réponse.
    Merci.

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

Discussions similaires

  1. Terminer proprement l'application
    Par dourouc05 dans le forum Téléchargez
    Réponses: 0
    Dernier message: 29/10/2010, 14h02
  2. Interrompre proprement certains threads
    Par syntaxerror dans le forum Général Java
    Réponses: 3
    Dernier message: 24/10/2010, 10h54
  3. Terminer proprement une vidéo
    Par attwad dans le forum OpenCV
    Réponses: 1
    Dernier message: 31/10/2008, 07h51
  4. Arrêter proprement le thread d'une JFrame
    Par fabrisss dans le forum Agents de placement/Fenêtres
    Réponses: 1
    Dernier message: 04/12/2006, 12h32
  5. Réponses: 5
    Dernier message: 16/12/2005, 17h41

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