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.
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.
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.
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));
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
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.
Une fonction membre non statique possède un argument implicite, celui de l'instance de classe concernée.
Exemple:
Dans l'exemple ci dessus, c'est this. Alp t'a montré un appel pour une instance ptr_objet.
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)); }
De base.
Et c'est à cause de ça qu'on utilise bind...
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.
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 :
Ou encore, dans Troubleshooting :Pointers to member functions and pointers to data members are not function objects, because they do not support operator().
Bonne continuation !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 }
Poukill
Salut,
Oui c'est possible, par exemple :
Cf. le constructeur en question de boost::thread.
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; };
Ou au pire :
Cf. cet autre constructeur de boost::thread.
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; };
MAT.
+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 !![]()
Partager