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 :
- --- definition des methodes et classes ---
- typedef struct
- {
- int nb; // Nombre d'octets recus
- char buf[1500];
- } Recv;
- class Listener
- {
- public:
- Listener();
- void lecture(); // lecture sur la socket
- Recv get_buffer(); // renvoie du buffer
- void set_listener(Sock L_socket); //mis en place de la socket
- pthread_mutex_t verrou;
- private:
- Sock listener; // structure contenant la socket
- Recv ret;
- };
- void Listener::lecture()
- {
- cout << "Lancement de la lecture" << endl;
- while (1))
- {
- Recv temp;
- temp.nb = -1;
- memset (ret.buf, 0, sizeof (ret.buf));
- temp=recv(listener);
- pthread_mutex_lock( &verrou );
- ret.nb = temp.nb;
- strcpy(ret.buf, temp.buf);
- pthread_mutex_unlock( &verrou );
- cout << "sortie 1" << endl << ret.nb << endl << ret.buf << endl;
- }
- };
- Recv Listener::get_buffer()
- {
- Recv temp;
- pthread_mutex_lock( &verrou );
- temp.nb =ret.nb;
- strcpy(temp.buf, ret.buf);
- cout << "sortie 2" << endl << ret.nb << endl << ret.buf << endl;
- pthread_mutex_unlock( &verrou );
- return temp;
- };
- class Parseur
- {
- public:
- Parseur();
- void make_parse(); // fct qui fait le parse !
- void action();
- private:
- Listener *listen;
- Recv buffer;
- };
- void Parseur::action()
- {
- while (1)
- {
- buffer.nb = -1;
- memset (buffer.buf, 0, sizeof (buffer.buf));
- buffer = listen->get_buffer(); // on récup le Recv de l'objet listener (en gros la variable ret)
- make_parse();
- }
- };
|
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 :
- ------Main------
- // initialisation des deux objets
- Listener ecouteur;
- Parseur decoupeur;
- decoupeur.set_listener(&ecouteur); //je passe l'adresse de l'objet Listener à l'objet Parseur,
- //pour qu'il puisse récupérer le buffer !
- //lance un thread qui excute la methode Listener::lecture
- x_Filament_Ameliore<Listener> fil_ecouteur(&ecouteur, &Listener::lecture);
- //lance un thread qui excute la methode Parseur::action
- x_Filament_Ameliore<Parseur> fil_decoupeur(&decoupeur, &Parseur::action);
- // 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