Récupérer la position actuelle d'un objet dynamique d'une liste

Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
- - Dernière réponse : Guillamue06
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
- 23 févr. 2012 à 15:09
Bonjour, je suis confronté à un problème au niveau d'une liste qui créé des objets tcpclient dynamiquement :

Admettons que j'ai déjà 3 objets tcpclient (objClient) généré dynamiquement puis une variable "i" correspondant au numéro de l'objet.

Je vais déclarer ma variable "i" comme ceci :
Dim i As Integer = objClient.Count - 1

Etant donné que lorsque un objet est généré, il occupe la dernière place de la liste.

J'ai donc dans ma liste : 0, 1, 2

Si l'objet "0" part (vue que c'est des tcpclient) le "1" prend comme position "0" et le "2" prend la position "1".

Le problème est que leurs variable "i" elle, ne décrémente pas !

Et vue qu'en cas de déconnexion j'appel un private sub (déconnexion) avec comme argument "i" pour pouvoir traiter cette objet il y a problème...

Je cherche donc a connaitre la position réel, actuelle d'un objet mais étant donné que j'ai besoin de "i" qui est obselète pour récuperer la position je c'est pas quoi faire

Si une personne à une idée merci d'avance.

PS: J'ai pensé à une solution, c'est quand la sub "déconnexion" est appelé, je créé une condition du type : "Si (i) est plus petit que mon numéro d'objet (et de thread) alors je décrémente mon "i" Mais le souci est que je ne peut pas récupérer cette condition vue qu'une boucle While avec une méthode bloquante bloquerai pour récupérer le numéro de l'objet déconnecté.
Afficher la suite 

8 réponses

0
Merci
Salut Guillaum,

Comme d'hab, je ne suis pa sûr d'avoir bien compris...

Il faudrait voir ton code pour comprendre comment tu gères la déconnexion, mais à mon avis tu dois attendre que chaque client soit bien déconnecté.

Dim i As Integer = objClient.Count - 1

Si tu as:
ma liste : 0, 1, 2

ton i est égal à 2, je ne vois pas trop comme ça...


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
0
Merci
Salut acive, content de te revoir.

Je vais essayé d'être un peut plus clair.
Alors c'est pour un serveur multi-client (multi-thread).

Comme je doit créer dynamiquement les objets TCPClient, je doit aussi reconnaître chaqu'un de ces objets afin de mener à bien le protocole.

Quand le serveur est lancer, voici se qui se passe :

    Private Sub AttenteConnexion()
        While 1
            If objClient.Count < ConnMax.Value Then
                objClient.Add(objServer.AcceptTcpClient())
                ThConn.Add(New Threading.Thread(AddressOf GestionConnexion))
                If VerifieClient(objClient.Count - 1) <> 0 Then
                    ThConn(ThConn.Count - 1).Start()
                Else
                    objClient(objClient.Count - 1).Close()
                    objClient.Remove(objClient(objClient.Count - 1))
                End If
 
                ' Sinon, on suppérieur au nombre de connexion MAX on met le thread en pause.
            Else
                Threading.Thread.Sleep(100)

            End If
        End While
    End Sub


J'accepte le client en l'ajoutant dans la liste "objClient" puis je créé un nouveau thread pour ce client et j'appel ce thread (GestionConnexion()).

Voici comment je fait pour pouvoir reconnaître l'objet afin de le gérer quand j'appel le thread :
Private Sub GestionConnexion()
Dim i As Integer =  objClient.Count - 1


Ensuite sa me permet de le reconnaître et de le gérer a travers mutliple fonction ( objClient(i) )

Jusqu'ici je pense que tu à compris.

Ensuite imagine 3 clients connectés au serveur (JeanPierre, Dédé et Moustaffa )

l'objet (objclient(i)) de Jeanpierre a donc comme numéro 0, Dédé lui à le 1 et Moustaffa à le numéro 2

JeanPierre en a marre et coupe la connexion (0).
A ce moment là il se passe quelque chose, c'est que la liste de objClient se remet dans l'ordre et Dédé passe au numéro 0 et Moustaffa passe au numéro 1 et comme j'ai déjà déclarer leur numéro et départ de l'appel du thread tous met objClient(i) devienne obsolete.

Ceci me provoque donc une erreur dans mon bloque déconnexion (mais par la suite surement a chaque appel de objClient(i))

 ' -----------------------------------------------------------------------
    ' Déconnexion d'un participant
    ' -----------------------------------------------------------------------
    Private Sub Deconnexion(ByVal i As Integer)

        accepter(i)  = False
        objClient(i).Close()
        objClient.Remove(objClient(i))
        Pseudo.Remove(Pseudo(i))
        accepter.Remove(i)

        'Envoi de la déconnexion du participant à tous le monde.
        For a As Integer = 0 To objClient.Count - 1
            If Pseudo(a) <> "" And a <> i And accepter(i) = True Then
                Dim StreamW As NetworkStream = objClient(a).GetStream
                Dim envoi = Encoding.UTF8.GetBytes("- " + Pseudo(i) + " a quitté la conversation." + vbCrLf)
                Try
                    StreamW.Write(envoi, 0, envoi.Length)
                Catch
                End Try
            End If
        Next a


    End Sub
Commenter la réponse de Guillamue06
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
Bonjour,
ce qui me saute personnellement déjà aux yeux, c'est cette chronologie
Pseudo.Remove(Pseudo(i))

accepter.Remove(i)
Envoi de la déconnexion du participant à tous le monde.
For a As Integer = 0 To objClient.Count - 1
if Pseudo(a) <> "" And a <> i And accepter(i) = True Then
Dim StreamW As NetworkStream = objClient(a).GetStream
Dim envoi = Encoding.UTF8.GetBytes("- " + Pseudo(i)
+ " a quitté la conversation." + vbCrLf)



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
0
Merci
Bonjour, comme j'ai dit plus haut :
Ceci me provoque donc une erreur dans mon bloque déconnexion (mais par la suite surement a chaque appel de objClient(i))


Bref, pour information sa bloque dès les premières lignes :

accepter(i) = False
objClient(i).Close()
objClient.Remove(objClient(i))
Pseudo.Remove(Pseudo(i))
accepter.Remove(i)

A savoir que "accepter" est une liste qui suis la même "chronologie" que la liste objClient(i)
Commenter la réponse de Guillamue06
Messages postés
18039
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
212
0
Merci
C'est comme à l'appel. Pour compter plus vite, tu invites les absents à lever le doigt ?

Une collection d'objets permettant de se référer à un objet tant par son index que par son nom, je ne vois pas vraiment le problème.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
0
Merci
J'ai bien compris que tu ne voyais pas ou était le problème.

A la base ce block été comme ça :

    Private Sub Deconnexion(ByVal i As Integer)

        'Envoi de la déconnexion du participant à tous le monde.
        For a As Integer = 0 To objClient.Count - 1
            If Pseudo(a) <> "" And a <> i And accepter(i) = True Then
                Dim StreamW As NetworkStream = objClient(a).GetStream
                Dim envoi = Encoding.UTF8.GetBytes("- " + Pseudo(i) + " a quitté la conversation." + vbCrLf)
                Try
                    StreamW.Write(envoi, 0, envoi.Length)
                Catch
                End Try
            End If
        Next a


       accepter(i) = False
        objClient(i).Close()
        objClient.Remove(objClient(i))
        Pseudo.Remove(Pseudo(i))
        accepter.Remove(i)

    End Sub


J'ai donc (pour tester) mis la boucle For en bas.
Commenter la réponse de Guillamue06
0
Merci
J'ai donc (pour tester) mis la boucle For en bas


Tu veux dire en Haut, oui, puisque tu fais appel à Pseudo(i) dans la boucle et tu l'enlèves en suite, le contraire n'a pas de sens.

C'est comme dans une salle de classe, si tu appelles un élève à qui tu as demandé de sortir précédemment... tu peux être sûr qu'il ne répondra pas.

Et après ce test ça bloque où alors?

Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
Commenter la réponse de Utilisateur anonyme
Messages postés
158
Date d'inscription
dimanche 18 avril 2004
Statut
Membre
Dernière intervention
25 juillet 2018
3
0
Merci
Pour faire simple en 2 mots, je cherche a préserver le numéro d'index des objets lorsqu'un objet avec un numéro d'index inférieur est supprimer.
Commenter la réponse de Guillamue06