churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008
-
3 août 2007 à 11:24
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
6 août 2007 à 19:07
Bonjour,
J'ai adapté la source Client-Serveur de LumesH (Merci à Yxion pour son aide) puis j'y ai ajouté un bouton "start/stop" côté serveur. Problème : Quand je redémarre le serveur après un arrêt, les méthodes appelées par le thread "StartServeur" et tous ses "threads enfants" sont exécutées une fois de plus, comme si chaque fois que je redémarre un thread venait s'ajouter et tournerait en parrallèle des autres. Pourtant je supprime le thread "StartServeur" à chaque arrêt du serveur.
Voici comment est créé le thread "StartServeur" :
public void Start()
{
InstanceServeurThread = new Thread(new ThreadStart(StartServeur));
InstanceServeurThread.Name = "InstanceServeurThread_" + _UniqueID;
InstanceServeurThread.Priority = ThreadPriority.Normal;
InstanceServeurThread.Start();
}
J'ai essayé plusieurs façon d'arrêter le thread dans la méthode "Stop", d'ailleurs il doit bien être supprimé puisqu'aucun client ne peut se connecter quand il est arrêté. Le seul moyen d'éviter ce problème c'est de redémarrer carrément l'appli.
Est-ce que quelqu'un a déjà rencontré ce problème dans l'utilisation des threads?
churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008 6 août 2007 à 16:08
Bon ben j'ai mis le temps mais j'ai fini par comprendre mon erreur en préparant l'exemple que je voulais mettre à disposition. En retirant chaque élément inutile pour l'exemple en question je me suis retrouvé avec quasiment rien et là, bingo, vu ma connerie!! ...qui m'a faite perdre des heures de concentration et quelques précieux neurones. Explications :
Le traitement du "start/stop" inclu en autres choses la prise en charge de l'évènement déclenché par le Thread et appelant ma méthode :
"InstanceClasseServeur.ConnectionStateEvent += new ConnectionStateHandler(ConnectionState);"
Donc à chaque fois que je redémarre en cliquant sur ce bouton une nouvelle prise en charge (supplémentaire) de l'évènement est créée, c'est pourquoi à chaque fois que l'évènement se produit l'appel de la méthode est effectué autant de fois que j'ai créé la prise en charge de l'évènement, c'est à dire autant de fois que j'ai cliqué sur le bouton "start/stop".
Les joies du débutant autodidacte, j'espère que ça pourra servir à d'autres.
churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008 3 août 2007 à 20:22
oui, mais ça change rien, j'ai l'impression qu'il reste toujours une instance en mémoire. Il faudrait effectuer une "purge complète" équivalent au redémarrage de l'appli, mais j'sais pas comment faire.
churrros
Messages postés19Date d'inscriptionmardi 26 juin 2007StatutMembreDernière intervention 9 avril 2008 4 août 2007 à 19:57
J'ai viré tout ce que je faisais dans la méthode sauf la création d'une instance socket avec une simple exception. Les appels aux méthodes de la form utilisant la classe qui démarre mes theads sont effectués par des invokes.
Je mettrais à dispo la semaine prochaine un exemple rapide reproduisant ce problème afin que vous ayez quelquechose de concret à tester.