Probleme Thread Posix + C++ - C++ - Programmation
Marsh Posté le 21-04-2003 à 17:13:57
pthread_create prends en argument une fonction void* (f*)(void*)
ta fonction doit donc coller
la manière générique en presque C
Code :
|
Marsh Posté le 21-04-2003 à 17:20:20
Merci pour vos réponses, mais ca ne va tjrs pas
++Taz ta réponse marche bien en C et si j'avais eu le choix je l'aurais codé en C au lieu de me prendre la tete en C++.
Le problème c'est que j'essaie de donner en parametre a pthread_create l'adresse de la methode de l'objet instancié. Le problème, je crois qu'il n'aime pas ça du tout...
Marsh Posté le 21-04-2003 à 17:22:53
écoute: j'ai parfaitement répondu à ta question: tu utilise une fonction C, la réponse est donc en C, meme si tu fais du C++. j E t'es fait un exemple complet de passage de paramètre à pthread_create. et gloop t'as donné la solution pour passer en paramètre une fonction membre. je vois pas ce que tu veux de plus.
Marsh Posté le 21-04-2003 à 17:31:38
Le probleme est que la tache possède d'autres méthodes dans sa structure.On peut pas mettre cela sous forme C a moins de virer carrèment la structure de classe aux taches... Mais ca va peut etre la solution tellement c'est pete boule.
Voilà la structure un peu plus evolué de la tache.
Code :
|
ah oui apparement on ne peut pas donner de fonction membre a la fonction pthread_create...
Marsh Posté le 21-04-2003 à 17:36:11
++Taz a écrit : t'as un problème de conception, c'est tout |
Quel probleme de conception , le fait de construire les taches d'envoi/reception sous forme de classe ? Il me semblait que c'était la meilleur solution...
Marsh Posté le 21-04-2003 à 17:38:01
ecoute vis ta vie. si tu veux pas faire la solution qu'on te propose, c'est que ça saatisfait pas ta conception. alors trouve un autre moyen
Marsh Posté le 21-04-2003 à 17:43:14
En gros tu m'expliques comment fonctionne pthread_create. Mais ca j'ai bien compris.
La question que je pose c'est comment utilisé pthread_create en mettant une fonction membre d'une classe em parametre.
C'est peut etre moi qui n'ait pas bien expliqué, bon je vais essayer d'etre plus clair...
Code :
|
Une solution ?
Marsh Posté le 21-04-2003 à 17:52:16
ce que je comprends toujours pas, c'est pourquoi ta tache ne se lance pas elle meme
Marsh Posté le 21-04-2003 à 17:58:18
La tache n'est lancé que lorsque le serveur lui donne l'ordre de le faire.
Sinon merci pour mem_fun je ne connaissais pas
Marsh Posté le 21-04-2003 à 22:31:41
si l'API t'impose de passer un pointeur de fonction
tu ne pourras pas t'en sortir avec une fonction membre non statique : tu dois utiliser un membre statique ou une fonction globale et passer this en parametre a ta fonction..
C'est pas tres complique.
Le seul probleme c'est que ce mecanisme ne peut pas etre virtuel
sauf si la fonction qui renvoie le pointeur de fonction statique est virtuel .
(ou si run appelle une methode virtuelle de Task juste apres).
Et non ce n'est pas du C: les fonctions globales et les methodes statiques font partie integrante du langage C++.
LeGreg
Marsh Posté le 22-04-2003 à 00:39:50
legreg a écrit : si l'API t'impose de passer un pointeur de fonction |
Merci j'ai effectivement utilisé cette solution en declarant une fonction membre statique dans la classe qui va dans son corps d'instruction appeler la methode non statique. Je crois que c assez connu comme bidouille.
Bon mon prog ne marche pas encore a 100% (deja pas de message d'erreur a la compilation) mais c deja ca
Marsh Posté le 22-04-2003 à 00:41:04
ZeMin a écrit : Je crois que c assez connu comme bidouille. |
c'est plus qu'une bidouille connue, c'est presque la méthode canonique
Marsh Posté le 21-04-2003 à 17:04:35
Salut,
Pour construire un serveur tcp, j'ai besoin de me servir des pthreads. Le programme est fait sous C++.
En gros la structure du programme :
Pour creer une tache encapsulant le methode run d'un objet Task, je me sert de pthread_create().
Mais il m'affiche un gros message d'insulte :
iotask.cpp:48: no matches converting function `run' to type `void**(&)(void*)'
task.cpp:38: candidates are: void* Task::run(void*)
J'ai pensé a bidouiller en mettant un pointeur de fonction en dehors de la structure de la classe puis encapsuler ce dernier au lieu de passer directement sur la methode run de l'objet Task mais je tombe sur le meme probleme.
Quelqu'un a une solution ?