immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008
-
13 févr. 2006 à 19:17
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014
-
18 févr. 2006 à 08:53
Bonjour!
j'ai de nouveau un petit problème, mais j'avoue, celui-là, je sais plus quoi faire : est ce qu'il pourrait y avoir une raison pour que le programme ignore une énumération foreach?
Je m'explique : j'ai une boucle foreach qui énumère les éléments d'une ArrayList.Synchronized (encore et toujours :p), elle même dans une boucle infinie, et dans un bloc d'instructions conditionnelles. Les éléments de l'ArrayList sont susceptibles d'être modifiées à chaque boucle.
A chaque fois que j'arrive à cet endroit du programme, j'obtiens un résultat aberrant. Je me suis penché sur le code, et, ne trouvant rien, j'ai mis des points d'arrêt aux endroits stratégiques et j'ai exécuté le programme. Surprise : la première fois que la condition est vérifiée, tout se passe bien, j'arrive au point d'arrêt foreach. Mais les fois suivantes, le programme fait comme s'il ignorait l'instruction, et le programme se bloque.
Avez vous déjà rencontré ce genre de problèmes? Est-ce une restriction des ArrayList?
J'espère que quelqu'un pourra me donner une réponse, je n'ai rien trouvé qui ressemble à ce problème...
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 13 févr. 2006 à 19:27
ce n'est pas le corps de l'instruction foreach qui ne s'exécute pas, c'est l'instruction foreach (enfin sauf si, lorsque je mets un point d'arrêt à la ligne du foreach, il pointe sur le corps)
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 13 févr. 2006 à 19:30
pardon j'ai oublié de dire que le thread s'arrête après cela, j'ai mis un autre point d'arrêt après les instructions conditionnelles et le programme ne s'y arrête plus passée la première boucle.
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 13 févr. 2006 à 19:36
ha ui heu tout cela sert à vérifier si l'ArrayList ne contient pas un objet dont l'une des propriétés est égale à une valeur.(je ne sais pas si je m'exprime correctement). Je teste donc dans le foreach si cl.name=="valeur".
S'il existe un moyen simple de tester directement la présence de la chaîne dans les propriétés des éléments de l'arraylist, ce serait aussi bien, mais je n'ai trouvé que la méthode Contains, qui traite l'objet entier.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 13 févr. 2006 à 22:43
Une solution serait d'implémenter ta propre classe de collection fortement typée et de traiter le test de cette propriété dans l'implémentation de ta méthode Contains.
En gros tu déplaces ta boucle :-)
La seule différence étant que tu feras un seul appel de méthode au lieu de c/c ta boucle si tu viens à maintenir une autre liste de clients (c'est bien ça ?) dans ton programme.
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 17 févr. 2006 à 19:24
merci de ta réponse coq!
désolé pour ma longue absence, de graves pb d'ordi... :p
sinon, est ce que tu pourrais me donner un exemple? Je sais je sais mais je débute :p
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 17 févr. 2006 à 21:59
en fait le problème ne concernait absolument pas le foreach ;) apparemment cela concerne une instruction receive qui fait planter tout le programme... je vais essayer de faire dans l'asynchrone pour régler ça, mais j'ai encore jamais fait, alors je sais pas si ça va donner quelque chose
immerczeck
Messages postés27Date d'inscriptionjeudi 2 septembre 2004StatutMembreDernière intervention28 juin 2008 18 févr. 2006 à 00:17
merci pour le code coq!!
sinon, aurais-tu une idée de la raison pour laquelle un Receive peut se bloquer en attente? comme si la socket était occupée ou quelque chose de ce genre...car c'est cela qui faisait en réalité planter mon programme, et je préfère ne pas poser un autre sujet pour ne pas encombrer le forum
cs_coq
Messages postés6349Date d'inscriptionsamedi 1 juin 2002StatutMembreDernière intervention 2 août 2014101 18 févr. 2006 à 08:53
Receive de ? Socket ?
Si c'est le cas Receive est synchrone, donc tant qu'elle n'a pas finis son execution, le thread dans lequel elle est lancée est bloqué.
Et elle ne terminera pas son execution tant qu'elle n'aura pas pû lire quelquechose dans le buffer de réception.