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

C++ Discussion :

Appel fonction member par pthread_create


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut Appel fonction member par pthread_create
    Bonjour,

    Je souhaiterais savoir comment utiliser les pthread pour appeler une fonction membre de ma classe.

    Voici schematiquement ce que je voudrais faire:


    .h
    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
     
    #include <pthread.h>
     
    struct pthread_data
    {
      double a;
      double b;
      double c;
    }
    class MyClass
    {
      void anotherMemberFunction();
      void memberFunctionToCall(double a, double b, double c);
     
      static void *threadHandler(void *args);
     
      struct pthread_data m_threads[2];
    }
    .cpp
    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
    #include "MyClass.h"
    void MyClass::anotherMemberFunction()
    {
      ...
      iret1 = pthread_create( &thread1, NULL, MyClass::threadHandler,
    						(void*) &m_threads[1]);
      iret2 = pthread_create( &thread1, NULL, MyClass::threadHandler,
    						(void*) &m_threads[2]);
      ...
    }
     
    void *MyClass::threadHandler(void *args)
    {
      struct pthread_data *data;
      data = (struct pthread_data*) args;
     
      memberFunctionToCall(data->a, data->b, data->c);
    }
    J'obtiens l'erreur suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: cannot call member function ‘void MyClass::memberFunctionToCall(double&, double&, double&)’ without object
    J'insiste sur le fait que je souhaite appeler la function "memberFunctionToCall" avec l'objet courant (et toutes les valeurs de ses membres au moment de l'appel) et donc éviter toute solution qui créerait un objet juste pour effetuer l'appel, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void handler(void *args)
    {
     MyClass c;
     c.memberFunctionToCall(...);
    }
    Merci de votre aide.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    Bonsoir. La fonction threadHandler() étant déclaré static, je ne pense pas qu'il soit possible d'y faire appel memberFunctionToCall qui n'est pas static.
    La solution serait peut être d'ajouter à la struct pthread_data un membre de type MyClass*

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    La solution est donc
    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
     
    class MyClass;
     
    struct pthread_data
    {
      double a;
      double b;
      double c;
      MyClass *o; // Représentera un pointeur sur l'objet courant
    };
     
    class MyClass
    {
      void anotherMemberFunction();
      void memberFunctionToCall(double a, double b, double c, MyClass *o);
     
      static void *threadHandler(void *args);
     
      struct pthread_data m_threads[2];
    }
     
    void *MyClass::threadHandler(void *args)
    {
      struct pthread_data *data;
      data = (struct pthread_data*) args;
     
      memberFunctionToCall(data->a, data->b, data->c, data->o);
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 488
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 488
    Par défaut
    C'est plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void *MyClass::threadHandler(void *args)
    {
      struct pthread_data *data;
      data = reintrepret_cast<struct pthread_data*> args;
     
      data->o->memberFunctionToCall(data->a, data->b, data->c, data->o);
    }
    Mais faut ajouter les vérifications habituelles.

  5. #5
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    Merci pour vos réponses, mais c'est le genre de solution que je voulais éviter.

    D'ailleurs je vois pas comment utiliser cela lors de l'appel à thread_create:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    m_threads[1]->o = ?; // this?
    iret1 = pthread_create( &thread1, NULL, MyClass::threadHandler,
    						(void*) &m_threads[1]);

  6. #6
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    @bacelar
    @LinuxUser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_threads[1]->o = this;
    Je pense que c'est cela.
    Cela dit, il y a un autre problème caché dans votre code. Avec la déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct pthread_data m_threads[2];
    et ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    iret2 = pthread_create( &thread1, NULL, MyClass::threadHandler,
    						(void*) &m_threads[2]); // c'est plutôt &m_threads[0] et ensuite &m_threads[1]
    Ca sent la SEGFAULT

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    J'ai une technique "bizarre" pour les threads POSIX en C++. Je passe un pointeur de la classe à mon thread et bien sur, comme il a été transformé en void*, je le caste dans le thread -> https://code.google.com/p/lpowerprob...ntation.cpp#43
    (On remarquera une possible erreur avec l'assert, mais bon... passons.)
    Et aussi, je mets en tant qu'amie, la fonction qui est lancée dans le thread -> https://code.google.com/p/lpowerprob...imentation.hpp ainsi, j'ai accès à mes fonctions/variables membres, une fois que je retourne dans ma classe, tranquillement.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. [PHP-JS] Appel de fonction PHP par JS
    Par pat06 dans le forum Langage
    Réponses: 5
    Dernier message: 29/11/2007, 09h03
  2. Réponses: 6
    Dernier message: 07/06/2007, 14h27
  3. Appel de fonctions php par variable
    Par WagaSeb dans le forum Langage
    Réponses: 2
    Dernier message: 02/06/2007, 11h06
  4. appeler une fonction définit par l'utilisateur
    Par paumi dans le forum C++Builder
    Réponses: 5
    Dernier message: 22/05/2007, 00h00
  5. [VB.Net] Problème appel fonction par un bouton
    Par balibo dans le forum ASP.NET
    Réponses: 4
    Dernier message: 25/11/2005, 10h48

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