[VB Net] Mise à jour d'un control dans un thread [Résolu]

Signaler
Messages postés
6
Date d'inscription
mercredi 6 février 2002
Statut
Membre
Dernière intervention
10 mars 2006
-
Messages postés
10
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
4 février 2007
-
Bonjour,

voilà mon soucis : Je suis en train de faire une appli client / serveur. La communication entre les deux se passent bien et c'est mon serveur qui envoie des données aux clients et je voudrais que quand mon client récupère une info du serveur, qu'il mette à jour par exemple un textbox de la form du client.
Mon soucis, c'est que quand je fais un truc du genre
TextBox1.AppendTest("coucou")
Ca ne marche, j'ai une erreur d'opérations inter thread car je recois mon info comme ceci dans un module à part :


tcpclnt =
New TcpClient()


tcpclnt.Connect(ipAddress.Trim(), portNumber)



If (tcpclnt.Connected)
Then



stm = tcpclnt.GetStream()


tcpThd =
New Thread(
AddressOf ReadSocket)


tcpThd.Start()



Else



MsgBox(
"Connexion échouée")



End
If


Public
Sub ReadSocket()




While
True




Try



readBuffer =
New [Byte](100) {}


stm.Read(readBuffer, 0, 100)



'Affichage du message reçu par le serveur



Form1.textBox1.AppendText((System.Text.Encoding.ASCII.GetString(readBuffer) + ControlChars.Cr + ControlChars.Lf))



Catch e
As Exception



MsgBox(e.ToString)



End
Try



End
While



End
Sub

J'ai regardé du coté des beginInvoke mais j'ai pas l'impression que çà va m'aider ...

Merci

4 réponses

Messages postés
134
Date d'inscription
vendredi 19 mars 2004
Statut
Membre
Dernière intervention
6 juin 2007

Bonjour,
J'ai eu le même problème avec une utilisation des évennements du filesystemwatcher qui se provoquent sur un autre thread...
Et après avoir pas mal galéré, j'ai réussi à contourner le problème avec les délégués. Pour ton cas, ça donnerait un truc du genre :

à ajouter :
private delegate sub dAjouteTexte(Texte as string)

Private sub AjouteTexte(Texte as string)
form1.textbox1.appendtext(texte)
end sub

Puis dans ta sub ReadSocket, tu remplaces la ligne qui ajoute le texte par :
me.invoke(new dajoutetexte(addressof AjouteTexte),(System.Text.Encoding.ASCII.GetString(readBuffer) + ControlChars.Cr + ControlChars.Lf))

Et ça devrait marcher... enfin je pense...

Cela résoud-t-il ton problème ?

AlicVB
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
2375
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
22
Il est préférable de vérifier si l'appelant (ReadSocket) doit appeler une méthode invoke lors de l'appel de méthodes puisque l'appelant n'utilise pas le même thread que le thread où a été crée ton objet Textbox1.

if me.invokerequired then
me.invoke(new dajoutetexte(addressof AjouteTexte),(System.Text.Encoding.ASCII.GetString(readBuffer) + ControlChars.Cr + ControlChars.Lf))
end if
3
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Messages postés
6
Date d'inscription
mercredi 6 février 2002
Statut
Membre
Dernière intervention
10 mars 2006

Milles merci pour ces deux réponses, cela a bien résolu mon soucis

Encore merci
Messages postés
10
Date d'inscription
dimanche 23 février 2003
Statut
Membre
Dernière intervention
4 février 2007

Merci pour l'info
J'avais le meme probleme.
J'utilisais "Control.CheckForIllegalCrossThreadCalls = False" pour contourner le probleme.

CyberGob !