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

cs_Houba 6 Messages postés mercredi 6 février 2002Date d'inscription 10 mars 2006 Dernière intervention - 9 mars 2006 à 16:45 - Dernière réponse : cs_cybergob 10 Messages postés dimanche 23 février 2003Date d'inscription 4 février 2007 Dernière intervention
- 4 févr. 2007 à 07:52
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
Afficher la suite 

4 réponses

alicvb 134 Messages postés vendredi 19 mars 2004Date d'inscription 6 juin 2007 Dernière intervention - 9 mars 2006 à 19:12
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
cs_Willi 2381 Messages postés jeudi 12 juillet 2001Date d'inscription 13 février 2015 Dernière intervention - 9 mars 2006 à 19:54
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
cs_Houba 6 Messages postés mercredi 6 février 2002Date d'inscription 10 mars 2006 Dernière intervention - 10 mars 2006 à 07:15
0
Utile
Milles merci pour ces deux réponses, cela a bien résolu mon soucis

Encore merci
cs_cybergob 10 Messages postés dimanche 23 février 2003Date d'inscription 4 février 2007 Dernière intervention - 4 févr. 2007 à 07:52
0
Utile
Merci pour l'info
J'avais le meme probleme.
J'utilisais "Control.CheckForIllegalCrossThreadCalls = False" pour contourner le probleme.

CyberGob !

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.