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

Threads & Processus C++ Discussion :

Classe gestion de thread - Capter evenement stop


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut Classe gestion de thread - Capter evenement stop
    Bonsoir,

    J’implémente sur Boost::thread une classe mère de façon a gérer facilement mes threads sous formes d'objets.
    Chaque objet voulant être threadé hérite de cette classe et redéfinie une méthodes propre a son traitement. Il peut également ajouter un process d'init et de fin de traitement.

    Voici le code
    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
    class Task
    {
    public:
        Task();
        ~Task();
     
        virtual void   taskRun      ( void ) = 0;
        virtual void   taskInit     ( void );
        virtual void   taskTerminate( void );
        void           taskStart    ( void );    
        void           Exec         ( void );
        void           Wait         ( void );
     
    protected:
    private:
        boost::thread mThread;
     
    };
    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
     
    void Task::Exec( void )
    {
        taskInit();
        taskStart();
        taskTerminate();
    }
     
    void Task::Wait()
    {
        mThread.join();
    }
     
    void Task::taskInit( void )
    {
    }
     
    void Task::taskStart( void )
    {
        cout << "Task::taskStart" << endl;
        mThread = boost::thread( boost::bind( &Task::taskRun, boost::ref(*this) ) ); 
    }
     
    void Task::taskTerminate( void )
    {   
    }
    J'aurais voulu eglement rajouter comme traitement l'arret (que je ne sais malheureusement pas comment faire :/)
    Avez vous une idée sur comment je pourrais proceder ?

    Merci d'avance
    Guitou

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 118
    Par défaut
    Pour gérer l'arrêt : http://www.boost.org/doc/libs/1_52_0...read.interrupt

    Cependant je ne vois pas du tout l'intérêt de ton encapsulation, sachant que tu ne fais que (quasiment) wrapper boost::thread sans réelle traitement en plus.

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par backlash Voir le message
    Pour gérer l'arrêt : http://www.boost.org/doc/libs/1_52_0...read.interrupt

    Cependant je ne vois pas du tout l'intérêt de ton encapsulation, sachant que tu ne fais que (quasiment) wrapper boost::thread sans réelle traitement en plus.
    L'intérêt est peut-être de wrapper boost.thread en attandant que std::thread soit correctement implémenté sur la majorité des compilateurs - bien que pour ma part, je proposerais (ou tenterais de proposer) une classe cpp11::thread dont l'interface est la même que std::thread, et s'appuyant sur boot.thread le temps de la transition.

    Pour ce qui est d'un arrêt propre d'un thread, il est peut-être préférable de faire quelque chose de moins violent que interrupt() - passer par une variable atomique, et tester cette variable dans le corps du thread (via, par exemple, une méthode shall_stop()).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci pour vos reponses,

    Bien entendu l'exemple posté n'est que le debut donc ne fait que réencapsuler la base.
    L'interet comme le dit Emmanuel est d'attendre le support de std::thread, mais c'est sur qu'en utilisant les memes noms ça facilitera le boulot.
    De plus ça permet d'instaurer des pseudos regles sur les droits de chaque dev sur un objet thread, ou d'en faciliter l'usage.

    Pour le stop je pourrai effectivement faire un mix de vos 2 idees:

    1- utiliser interrupt:
    La tache passe obligatoirement par une phase d'init, son run et un temrinate.
    L'idée est que dans le run, aucune allocation ne soit effectuée (l'init est fait pour ca), ce n'est qu'un thread de calcul.
    Si le stop fait un interrupt sur le thread en cours, cette interruption sera suivie du "terminate" (car l'execution suit la regle: init>run>temrinate).
    Ai je bon ?

    2- Pour les threads plus complexes implementer dans la classe mere un flag d'interruption. Et le tester a differents endroits critiques dans le run de la classe derivee

    Qu'en pensez vous ?

    Merci d'avance

Discussions similaires

  1. Gestion des Threads
    Par Nalfouille dans le forum MFC
    Réponses: 3
    Dernier message: 05/04/2006, 16h29
  2. classe dérivée de thread
    Par aaronw dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 08/03/2006, 15h35
  3. Gestion des threads
    Par yanis97 dans le forum C++
    Réponses: 6
    Dernier message: 08/03/2006, 09h39
  4. GEstion des thread
    Par Julien Dufour dans le forum Access
    Réponses: 8
    Dernier message: 06/10/2004, 14h28
  5. [reseaux] Gestion des threads en perl
    Par totox17 dans le forum Programmation et administration système
    Réponses: 2
    Dernier message: 28/11/2002, 09h40

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