Bonjour à tous,
J'ai un soucis sur une fonction dont le role est de réaliser une forme de "heartbeat" dans une application client/serveur en mode connecté. En l'occurence le serveur envoie une requete toutes les x secondes aux clients référencés et en cas de non retour de leur part les supprime de la liste de utilisateurs identifiés (et libère effctivement l'espace mémoire alloué).
Dans le détail mes utilisateurs connectés sont contenus dans un vecteur du type suivant:
sachant que la classe "user" ne contient qu'un seul objet alloué dynamiquement (une socket tcp qui est le lien entre le client et ce user particulier) et des infos générales (nom, IP du client, etc).
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::vector<boost::shared_ptr<user> > _users
Le code du heartbeat est le suivant (un peu épuré):
(à noter que cette fonction est éxécutée dans un thread dédié)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 void heartbeat() { while (1) { bool errorFound = false; for (vector<boost::shared_ptr<user> >::iterator i = _users.begin(); i != _users.end(); i++) { // code de la requete et du retour ... send, receive etc if (errorFound) { i->reset(); _users.erase(i); } } // not portable, Windows only due to windows.h Sleep(5000); } }
Sous cette forme ça ne marche pas dans le cas que j'ai testé le premier: un seul utilisateur référencé dans la liste. Le reset du shared_ptr passe (vérifié via un use_count avant/après et un test dans le destructeur de user) par contre vu que le vector n'a qu'un seul élément Windows me crache une erreur comme quoi le vecteur est vide (logique quelque part...).
J'ai testé avec unmais il n'est pas content non plus vu que i du coup est incrémenté et dépasse _users.end() (si j'ai bien compris).
Code : Sélectionner tout - Visualiser dans une fenêtre à part i = _users.erase(i)
Pour l'instant je ne suis pas très chaud à l'idée de traiter ce cas en spécifique avec un _users.clear() si _users.size() egale 1 (j'ai l'impression que l'espace mémoire resterait alloué). J'ai lu ailleurs dans le forum que l'on pourrait utiliser un swap mais j'ai du mal à comprendre avec quoi échanger le vecteur dans ce cas là.
Quelle solution pensez vous que je devrais implémenter dans mon cas ?
Partager