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 :

thread dédié à une classe pour lui "donner vie"


Sujet :

Threads & Processus C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut thread dédié à une classe pour lui "donner vie"
    Bonjour,
    Mon problème est le suivant :
    Je souhaite créer une classe qui lance son propre thread :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class maClasse
    {
    public:
      maClasse();
      ~maClasse();
    private:
      pthread_t pMonThread;
      void *monThread(void *arg);
      bool stop_thread;
    };
    Seulement voila :
    il semblerait qu'il soit impossible de recuperer l'adresse d'une fonction membre pour l'utiliser dans le pthread_create( &pMonThread;, NULL, &monThread, NULL );
    rendre mon thread static empeche l'acces aux membres de la classe...

    Est-il envisageable de mettre mon thread en friend, et de lui envoyer le this de la classe en argument de pthreadcreate() ... ou bien le choix de cacher un thread dans une classe est-il tout simplement débile ?

    Toute idée/critique sera la bienvenue !!
    je vais essayer d'arriver a un résultat qui veuille bien marcher en attendant

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut
    OUPS !
    Merci beaucoup, je vais lire ça !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut
    Bon, j'ai codé mon petit bazard en m'aidant fortement de la FAQ. (Je code sous linux)
    Mon but étant de lancer un thread a l'intérieur même de ma classe, cela donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    maclasse.h :
    ...
    class MaClasse
    {
    public:
      MaClasse();
      ~MaClasse();
     
      static void * StaticThreadFunc( void *Param );
    private:
      void * ThreadFunc();
      pthread_t pThreadMaClasse;
    };
    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
    maclasse.cpp :
    #include "maclasse.h"
     
    MaClasse::MaClasse()
    {
      pthread_create( &pThreadMaClasse, NULL, &MaClasse::StaticThreadFunc ,this );
    }
     
    MaClasse::~MaClasse()
    {
      pthread_join( pThreadMaClasse, NULL ); // attends le thread
    }
     
    static
    void *
    MaClasse::StaticThreadFunc( void *Param )
    {
      MaClasse* Obj = reinterpret_cast<MaClasse*>( Param );
      return Obj->ThreadFunc();
    }
     
    void *
    MaClasse::ThreadFunc()
    {
      // ...
      return 0;
    }
    Seulement voila :
    Citation Envoyé par gcc
    maclasse.cpp:19: error: ne peut déclarer la fonction membre « static void* MaClasse::StaticThreadFunc(void*) » comme ayant un lien statique
    erreur qui ne se produit pas lorsque je fais le pthread_create dans mon main avec un pointeur de MaClasse dûment alloué.

    Quelqu'un aurait-il connaissance d'un subterfuge supplémentaire pour faire marcher mon truc ?

    Je vais essayer de mettre mon thread en friend de ma classe, on ne sait jamais ...

  5. #5
    Membre éclairé Avatar de Higestromm
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    516
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 516
    Par défaut
    Dans ton .cpp tu doit enlever le static devant ta déclaration de fonction.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 29
    Par défaut
    Marvelous !!!!
    Ca marche !

    Merci beaucoup !
    Comme quoi, il me manque encore une bonne dizaine d'années d'expérience

    PS : J'ai déplacé StaticThreadFunc() dans private pour rendre ma classe plus nette

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

Discussions similaires

  1. Précision sur fonction static d'une classe pour Thread
    Par thebop dans le forum Threads & Processus
    Réponses: 9
    Dernier message: 22/06/2009, 14h18
  2. Y a t'il une classe pour transactions FTP
    Par Devil666 dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 04/07/2005, 12h27
  3. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16

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