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

  FORUM HardWare.fr
  Programmation
  C++

  problème d'accès variable entre deux threads

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

problème d'accès variable entre deux threads

n°1590778
wadcyr8_19​7
Posté le 24-07-2007 à 13:44:05  profilanswer
 

Salut à tous,
 
je suis en train de bosser sur un petit programme qui ouvre un thread pour écouter un port tcp (récupère donc un char* qui contient du xml) et qui a un second thread qui doit récupérer ce message xml pour le parser.
j'ai fais pour cela deux classe, une qui gère l'écoute et une qui gère le parsage mais j'ai un problème pour la récupération de la variable contenant le message xml de ma classe d'écoute avec ma classe de parsage.
 
voici les extraits de codes utiles à comprendre mon prog
 

Code :
  1. --- definition des methodes et classes ---
  2. typedef struct
  3. {
  4.     int nb;             // Nombre d'octets recus
  5.     char buf[1500];
  6. } Recv;
  7. class Listener
  8. {
  9.     public:
  10.     Listener();
  11.     void lecture(); // lecture sur la socket
  12.     Recv get_buffer(); // renvoie du buffer
  13.     void set_listener(Sock L_socket); //mis en place de la socket
  14.     pthread_mutex_t verrou;
  15.     private:
  16.     Sock listener; // structure contenant la socket
  17.     Recv ret;
  18. };
  19. void Listener::lecture()
  20. {
  21.     cout << "Lancement de la lecture" << endl;
  22.     while (1))
  23.     {
  24.         Recv temp;
  25.         temp.nb = -1;
  26.         memset (ret.buf, 0, sizeof (ret.buf));
  27.         temp=recv(listener);
  28.         pthread_mutex_lock( &verrou );
  29.         ret.nb = temp.nb;
  30.         strcpy(ret.buf, temp.buf);
  31.         pthread_mutex_unlock( &verrou );
  32.        cout << "sortie 1" << endl << ret.nb << endl << ret.buf  << endl;
  33.     }
  34. };
  35. Recv Listener::get_buffer()
  36. {
  37.     Recv temp;
  38.     pthread_mutex_lock( &verrou );
  39.     temp.nb =ret.nb;
  40.     strcpy(temp.buf, ret.buf);
  41.     cout << "sortie 2"  << endl << ret.nb << endl << ret.buf << endl;
  42.     pthread_mutex_unlock( &verrou );
  43.     return temp;
  44. };
  45. class Parseur
  46. {
  47.     public:
  48.     Parseur();
  49.     void make_parse(); // fct qui fait le parse !
  50.     void action();
  51.     private:
  52.     Listener *listen;
  53.     Recv buffer;
  54. };
  55. void Parseur::action()
  56. {
  57.     while (1)
  58.     {
  59.         buffer.nb = -1;
  60.         memset (buffer.buf, 0, sizeof (buffer.buf));
  61.         buffer = listen->get_buffer(); // on récup le Recv de l'objet listener (en gros la variable ret)
  62.         make_parse();
  63.     }
  64. };


 
ensuite on passe à ma fonction principale
pour créer mes threads, je me suis servi de la classe x_filament_amelioree trouvée ici :http://www.cppfrance.com/code.aspx?ID=19908
 

Code :
  1. ------Main------
  2. // initialisation des deux objets
  3. Listener ecouteur;
  4. Parseur decoupeur;
  5. decoupeur.set_listener(&ecouteur); //je passe l'adresse de l'objet Listener à l'objet Parseur,  
  6.                                                 //pour qu'il puisse récupérer le buffer !
  7. //lance un thread qui excute la methode Listener::lecture
  8. x_Filament_Ameliore<Listener> fil_ecouteur(&ecouteur, &Listener::lecture);
  9. //lance un thread qui excute la methode Parseur::action
  10. x_Filament_Ameliore<Parseur> fil_decoupeur(&decoupeur, &Parseur::action);
  11. // et là ça merde ! :D


 
au final, la lecture se déroule bien , j'ai bien le nombre d'octets lu et le contenu de mon buffer qui s'affiche au niveau de la sortie 1. Par contre sur la sortie 2, j'ai le nb d'octets, mais j'ai un truc vide pour ce qui est du buf.
j'ai essayé de voir si en exécutant mon get_buffer à la suite de ma ma boucle dans le Listener::lecture() et là tout marche nickel.
je comprends vraiment plus rien là, donc si quelqu'un peut m'aider !
 
merci d'avance
Wad

mood
Publicité
Posté le 24-07-2007 à 13:44:05  profilanswer
 

n°1590902
KangOl
Profil : pointeur
Posté le 24-07-2007 à 15:25:42  profilanswer
 

c'est quoi ce parser qui contient un listener ?
 
il n'ont rien a voir entre eux ces deux la ! le parser ne doit pas aller chercher les données a parser, on doit lui fournir (sous forme de stream pour bien faire)

n°1590982
wadcyr8_19​7
Posté le 24-07-2007 à 16:31:06  profilanswer
 

comment faire ?
 
oui, je débute un peu, donc j'ai du mal :d


Message édité par wadcyr8_197 le 24-07-2007 à 16:41:47

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

  problème d'accès variable entre deux threads

 

Sujets relatifs
[VBA] Nom champs stockés dans une variableProblème CSS sur un bouton
Probleme openGL et POO sous VC++Problème de type sur Variable de formulaire
probleme fread magicprobleme integration flash dans firefox
Problème avec fonction IF NOT EXISTVariable pour répartition dans un tableau (module streaming TV)
Déterminer une variable par ligne dans menu dynamique 
Plus de sujets relatifs à : problème d'accès variable entre deux threads


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