[INDY]Threads->LockList();
Bonjour,
J'utilise un serveur TCP Indy (version 9) et au moment de la fermeture du serveur, je veux envoyer un messages à tous les clients connectés.
Voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| if (Serveur1TCP == true)
{
TList *List = new TList();
try {
List = TCPS1->Threads->LockList();
int I = 0;
while (I < List->Count)
{
TIdPeerThread(List->Items[I]).Connection->WriteLn("Serveur stop. Vous allez être déconnecté."); // ligne posant problème
I++;
}
TCPS1->Threads->UnlockList();
delete List;
}
catch ( ... )
{
}
try {
TCPS1->Active = false;
}
catch ( ... )
{
}
Serveur1TCP = false; |
Quand le code passe sur la ligne posant problème, une exeption arrive (il n'y a qu'un client connecté :
Citation:
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet serveur.exe a provoqué une classe d'exception EAccessViolation avec le message 'Violation d'accès à l'adresse 00402BE4. Lecture de l'adresse 00000000'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------
Il n'y a pas de bug si aucun client est connecté et si ce bug a lieu, il y a ensuite ce message quand j'arrive à la ligne qui ferme le serveur :
Citation:
---------------------------
Notification d'une exception du débogueur
---------------------------
Le projet serveur.exe a provoqué une classe d'exception EIdTerminateThreadTimeout avec le message 'Terminate Thread Timeout'. Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.
---------------------------
OK Aide
---------------------------
Je me suis inspiré de cette page :
http://delphi.developpez.com/faq/?pa...veurversclient
Je n'ai pas mis Pred() parce que je ne sais pas ce que c'est comme fonction, il n'y a rien dans l'aide et C++builder me dit qu'il jne connait pas cette fonction.
Quelqu'un sait comment résoudre ce problème?
Merci
QQ Erreurs de code il me semble...
Bonjour,
Au risque de dire une betise :
Le pointeur sur la TList retournée par la fonction TThreadList::LockList() est un pointeur sur une liste de void*.
De part sa provenance (la fonction LockList...), cette TList ne contient que des TIdPeerThread*, il faut donc obligatoirement faire un cast vers des pointeurs de TIdPeerThread :
Code:
1 2 3 4 5 6 7 8 9
|
[...]
while (I < List->Count)
{
((TIdPeerThread*)(List->Items[I]))->Connection->WriteLn("Serveur stop. Vous allez être déconnecté.");
((TIdPeerThread*)(List->Items[I]))->Connection->Disconnect();
I++;
}
[...] |
Voila qui pourrait resoudre le bug lorsqu'il y a des clients connectés...
Pour le bug qui se produit en l'absence de client, il me semble, d'apres l'erreur de timeout, que la liste de thread reste verrouillée...
PS : Je pense que l'instanciation de ta TList n'est pas nécessaire..
... et que le
est plutot dangeureux car tu libere le pointeur fournit par LockList()...
Conseil (1) : Le 'for' est plus "sûr" que le 'while' (il evite généralement les malencontreuses boucles infinies)
Conseil (2) : L'identation du code permet une lecture et une comprehension rapide du code... Et en plus ça permet de savoir à quel 'try' les 'catch' font référence... ;-)