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 :

Pthread et fonction d'un objet


Sujet :

Threads & Processus C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut Pthread et fonction d'un objet
    Bonjour,

    Je voudrais utiliser la librairie qui gére les threads sous linux sous C++.
    Je vous explique mon soucis, j'ai créé une fonction Ptread qui gére les threads en c++ et lorsque je dois passer la fonction process je voudrais faire passer la fonction d'un objet.
    Par exemple un objet toto qui a une fonction process, je voudrais pouvoir faire quelque chose comme : pthread_create(mythread, NULL, toto.process, NULL);

    Comment puis-je faire ceci?

    D'avance merci.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonsoir,

    Une solution est de placer la fonction de création de Thread que tu as écrites dans une classe abstraite.

    La fonction membre Process serait :
    - virtuelle pure dans la classe Thread de base,
    - serait implémenté par les enfants qui hérite de cette classe.
    Le code a exécuter dans le Thread se trouverait dans cette fonction.
    - appelée indirectement par une méthode Friend de la classe de base.

    La déclaration pourrait ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Thread
    {
        protected:
            virtual void Process() = 0;  // la méthode à implémenter dans la classe enfant
            Thread();
        public:
            virtual ~Thread();
            friend void ThrdProcess(Thread *Thrd) ; // la fonction appelée par pthread_create
    };
    La définition à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //---------------------------------------------------------------------------
    Thread::Thread()
    {
        pthread_create(mythread, NULL, (void *)(ThrdProcess), (void*)(this));
    }
     
    void ThrdProcess(Thread *Thrd)
    {
        if(Thrd != NULL)
        {
            Thrd->Process() ; // appel de la fonction à définir dans la classe enfant.
        }
    }
    Tu verras bien vite que d'autres des fonctionnalités autour du thread seront utiles.
    (savoir si le Thread est terminé ou non, stocker le handle, le destructeur pour toujours arrêter et libérer les ressources du thread ...).
    Donc partir sur une classe Thread à part est très certainement plus sain que de vouloir passer une adresse de méthode de plusieurs objets directement à pthread_create(...).

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut Re
    Merci de votre réponse.

    Donc si j'ai bien compris le truc, il faut que le fasse une classe toto qui hérite de cette classe. Ensuite je surcharge la fonction Process dans ma classe toto.
    Donc dans mon main j'appelle le thread de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Thread *myMGThread = new Thread();
    myMGThread->ThrdProcess(new toto())
    C'est bien ca?

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut C'est presque ça ;)
    il faut que le fasse une classe toto qui hérite de cette classe. Ensuite je surcharge la fonction Process dans ma fonction toto.
    Jusqu'ici tout va bien

    le thread de cette facon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread *myMGThread = new Thread();
    myMGThread->ThrdProcess(new toto())
    La c'est plus bon :
    - Thread est une classe abstraite, donc new Thread(); est impossible.
    - Comme le constructeur de la classe Thread appelle la fonction ThrdProcess, c'est inutile de l'appeler explicitement.

    Tout ce que tu as à faire :
    - dérivé Thread pour implémenter la fonction Process().
    - dès la création d'un objet du type de la classe enfant (ex : Toto * pTh = new Toto();) , le thread se lancera,
    et la fonction Process() sera appelée automatiquement.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Par défaut RE
    Ok j'ai pigé le fonctionnement.

    Merci.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    De rien.
    A+

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

Discussions similaires

  1. Fonction retournant une objet de type recipients
    Par ToxiZz dans le forum VBA Access
    Réponses: 13
    Dernier message: 15/07/2008, 10h48
  2. Réponses: 1
    Dernier message: 04/02/2008, 21h35
  3. Réponses: 2
    Dernier message: 20/06/2007, 12h12
  4. Réponses: 2
    Dernier message: 01/06/2007, 08h57
  5. Réponses: 6
    Dernier message: 02/10/2006, 12h13

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