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

Boost C++ Discussion :

Boost::thread : appel d'une fonction membre non statique


Sujet :

Boost C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut Boost::thread : appel d'une fonction membre non statique
    Hello,

    Est-il possible de créer un thread Boost en lui filant la fonction membre d'un objet (fonction non statique, donc) ?

    Ça ne marche pas chez moi, et je n'arrive pas pas à trouver des infos sûres sur le sujet.

    Merci.

  2. #2
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    boost::thread attends un CallableObject.
    Donc soit tu passe par lambda::bind pour lui passer une boost::function qui encapsule l'objet cible et son pointeur de méthode, soit tu transforme ton objet pour en fair eun CallableObject.

  3. #3
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    Même boost::bind est suffisant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boost::thread t(boost::bind(&Classe::fonction, ptr_objet, arguments));

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Joel F, je ne sais même pas ce qu'est un CallableObject (un objet fonctionnel ?). :-)

    Merci Alp pour la ligne de code. Je vais jeter un œil à boost::bind.

    Je en comprend toutefois pas pourquoi une fonction membre statique est considérée comme un CallableObject, et pas une fonction membre non statique.

  5. #5
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Une fonction membre non statique possède un argument implicite, celui de l'instance de classe concernée.
    Exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Toto
    {
        void Foo() { std::cout << "Hello! " << std::endl; }
        void Call();
    };
     
    void Toto::Call()
    {
        // Appel de boost::thread
        boost::thread my_thread(boost::bind(&Toto::foo, this));
    }
    Dans l'exemple ci dessus, c'est this. Alp t'a montré un appel pour une instance ptr_objet.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par poukill Voir le message
    Une fonction membre non statique possède un argument implicite, celui de l'instance de classe concernée.
    En C++ de base, telle que vue par le compilateur, ou uniquement dans le cadre de l'utilisation de bind (sur le dernier cas, je l'avais compris) ?

  7. #7
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    De base.
    Et c'est à cause de ça qu'on utilise bind...

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    OK, merci. J'apprends encore un truc.

    Dommage que cela n'apparaisse pas dans la doc de boost::bind.
    On comprendrait mieux l'intérêt de son usage.

  9. #9
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    De rien. Content d'avoir pu t'aider.
    Celà dit, la doc de boost.Bind oriente un peu le lecteur quand même : http://www.boost.org/doc/libs/1_42_0...ember_pointers
    Notamment :
    Pointers to member functions and pointers to data members are not function objects, because they do not support operator().
    Ou encore, dans Troubleshooting :
    A common variation of this error is to forget that member functions have an implicit "this" argument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct X
    {
        int f(int);
    }
     
    int main()
    {
        boost::bind(&X::f, 1);     // error, X::f takes two arguments
        boost::bind(&X::f, _1, 1); // OK
    }
    Bonne continuation !

    Poukill

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Oui c'est possible, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class my_class
    {
    public:
      my_class() : t( &my_class::f, this ) {}
      void f() {}
    private:
      boost::thread t;
    };
    Cf. le constructeur en question de boost::thread.

    Ou au pire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class my_class
    {
    public:
      my_class() : t( boost::bind( &my_class::f, this ) ) {}
      void f() {}
    private:
      boost::thread t;
    };
    Cf. cet autre constructeur de boost::thread.

    MAT.

  11. #11
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    +1 avec Mat007 aussi.
    Ce qu'il faut retenir, c'est qu'il y a un this implicite avec une fonction membre non statique.
    Boost.Thread propose directement le bind, j'avais oublié !
    Pourquoi pas !

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

Discussions similaires

  1. Appel non conforme d'une fonction membre non static
    Par kryptong dans le forum Débuter
    Réponses: 3
    Dernier message: 16/04/2012, 17h00
  2. appel a une fonction membre sur un non-object
    Par totensai dans le forum Langage
    Réponses: 2
    Dernier message: 14/01/2012, 22h43
  3. [boost::thread] créer un thread sur une fonction membre.
    Par méphistopheles dans le forum Boost
    Réponses: 6
    Dernier message: 03/06/2009, 13h49
  4. Réponses: 9
    Dernier message: 24/08/2007, 12h37
  5. Boost thread avec fonction membre non statique.
    Par Klaim dans le forum Boost
    Réponses: 2
    Dernier message: 11/08/2007, 02h58

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