Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
956 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Probleme Thread Posix + C++

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme Thread Posix + C++

n°367779
ZeMin
Posté le 21-04-2003 à 17:04:35  profilanswer
 

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:

mood
Publicité
Posté le 21-04-2003 à 17:04:35  profilanswer
 

n°367784
gloop
Posté le 21-04-2003 à 17:12:03  profilanswer
 

mem_fun


Message édité par gloop le 21-04-2003 à 17:40:00
n°367787
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:13:57  profilanswer
 

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


n°367793
ZeMin
Posté le 21-04-2003 à 17:20:20  profilanswer
 

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

n°367794
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:22:53  profilanswer
 

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

n°367797
ZeMin
Posté le 21-04-2003 à 17:31:38  profilanswer
 

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
n°367799
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:34:17  profilanswer
 

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

n°367800
ZeMin
Posté le 21-04-2003 à 17:36:11  profilanswer
 

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

n°367801
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:38:01  profilanswer
 

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

n°367802
ZeMin
Posté le 21-04-2003 à 17:43:14  profilanswer
 

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 ?

mood
Publicité
Posté le 21-04-2003 à 17:43:14  profilanswer
 

n°367806
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:50:06  profilanswer
 

n°367809
Taz
bisounours-codeur
Posté le 21-04-2003 à 17:52:16  profilanswer
 

ce que je comprends toujours pas, c'est pourquoi ta tache ne se lance pas elle meme

n°367811
ZeMin
Posté le 21-04-2003 à 17:58:18  profilanswer
 

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
n°368037
LeGreg
Posté le 21-04-2003 à 22:31:41  profilanswer
 

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
n°368107
ZeMin
Posté le 22-04-2003 à 00:39:50  profilanswer
 

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

n°368109
Taz
bisounours-codeur
Posté le 22-04-2003 à 00:41:04  profilanswer
 

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

n°368119
Taz
bisounours-codeur
Posté le 22-04-2003 à 01:08:16  profilanswer
 

et j'espere que tu fais du static_cast à gogo


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Probleme Thread Posix + C++

 

Sujets relatifs
phpMyAdmin 2.5.0-rc1 : problème avec "mbstring".. C'est grave doc?Problème pour modifier des éléments d'un vecteur
Probleme de taille et de policeProblème formulaire php
[ CSS ] Probleme de DIV et possitionnement[C/C++] probleme d'inlining
Probleme lors d'un select en VBA[PHP] petit probleme avec boucle
Probleme avec JPGraph et generation d'image[PHP] probleme
Plus de sujets relatifs à : Probleme Thread Posix + C++


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR