Probleme Thread Posix + C++

Probleme Thread Posix + C++ - C++ - Programmation

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 :

Code :
  1. class Server {
  2. void startServ();
  3. };
  4. class Task {
  5. void* run(int arg);
  6. };


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 ? :cry:

Reply

Marsh Posté le 21-04-2003 à 17:04:35   

Reply

Marsh Posté le 21-04-2003 à 17:12:03    

mem_fun


Message édité par gloop le 21-04-2003 à 17:40:00
Reply

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 :
  1. struct ma_fonction_args
  2. {
  3.   int i;
  4.   /* et tout ce que tu veux */
  5. };
  6. void* ma_fonction(void *vargs)
  7. {
  8.   ma_fonction_args *args=vargs;
  9.   args->i;
  10.   /* etc */
  11. }
  12. struct ma_fonction_args args={1, /*....*/}
  13. pthread_create(..., ma_fonction, &args);


Reply

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... :(

Reply

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.

Reply

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 :
  1. class Task {
  2. public:
  3.   void init();
  4.   void* run(void* arg);
  5. private:
  6.   int* data;
  7.   int sizeData;
  8.   void send();
  9.   void recv();
  10. };


 
ah oui apparement on ne peut pas donner de fonction membre a la fonction pthread_create...


Message édité par ZeMin le 21-04-2003 à 17:34:41
Reply

Marsh Posté le 21-04-2003 à 17:34:17    

t'as un problème de conception, c'est tout

Reply

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...

Reply

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

Reply

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 :
  1. void* toto(void* args)
  2. pthread_create(...,toto,...); // Ca ca marche
  3. classe A {
  4. public:
  5. void* run(void* args);
  6. };
  7. A* a = new A;
  8. pthread_create(...,a->run,...); //Ca ca ne marche pas


 
Une solution ?

Reply

Marsh Posté le 21-04-2003 à 17:43:14   

Reply

Marsh Posté le 21-04-2003 à 17:50:06    

Reply

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

Reply

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


Message édité par ZeMin le 21-04-2003 à 17:59:13
Reply

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


---------------
voxel terrain render engine | animation mentor
Reply

Marsh Posté le 22-04-2003 à 00:39:50    

legreg a écrit :

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


 
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 :)

Reply

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

Reply

Marsh Posté le 22-04-2003 à 01:08:16    

et j'espere que tu fais du static_cast à gogo

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed