Bonjour,
Je voudrais savoir s'il est possible de passer comme fonction à pthread_create un fonction membre de classe ? j'ai essayé avec la stl et avec boost, mais je ne sais si je m'y prend correctement.. une solution ?
Bonjour,
Je voudrais savoir s'il est possible de passer comme fonction à pthread_create un fonction membre de classe ? j'ai essayé avec la stl et avec boost, mais je ne sais si je m'y prend correctement.. une solution ?
Une solution est donnée dans la FAQ C++ (avec les threads Windows). Recherche un truc du genre "Pourquoi ne peut-on pas passer une fonction membre là où un pointeur de fonction est attendu ?".
Merci pour la réponse, mais en fait dans la faq il est juste indiqué pourquoi c'est un problème, pas comment le résoudre. (si, c'est indiqué de déclarer la fonction en statique... ou de changer le prototype de la fonction appelante : pas possible)
en fait je cherche une solution du genre de celle qui est implémentée dans la libsigc++ ou tu peut faire un sigc_fun() à partir du nom de la classe, du membre, et d'un objet. j'imagine que la meme chose doit exister ailleurs ? (stl::mem_fun ? boost::function ?)
Pas de solution dans la FAQ ? Et le code qui est donné c'est quoi ?
De toute façon c'est une fonction C, qui attend un pointeur sur fonction libre et pas autre chose. Alors si tu trouves un mécanisme qui permet de passer des fonctions membres, ce sera de toute façon toujours implémenté avec une fonction non membre (ou membre statique -- c'est parfois plus propre) qui redirige vers la fonction / instance voulue. Avec les threads ça se fait plutôt bien, puisque tu peux passer l'instance de ta classe en "user data".
La solution de la FAQ ce n'est pas de passer la fonction en statique, c'est d'ajouter une fonction statique qui permet de rediriger vers la fonction membre (relis bien le code...).
Voici une partie de mon implémentation pour pouvoir appeler indirectement une fonction membre d'une classe (en fait l'operator() )
Je n'ai pas regardé la FAQ, mais j'imagine que l'idée de base est la même.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 template<class F> void *thread_function(void *f) { (*static_cast<F *>(f))(); return 0; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function_type func(...); // construit la classe, en fait un foncteur pthread_create(&th,0,&thread_function<function_type>,(void *)&func)
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager