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

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

Meilleure réponse
Messages postés
134
Date d'inscription
vendredi 19 mars 2004
Dernière intervention
6 juin 2007
- 9 mars 2006 à 19:12
3
Merci
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

Merci alicvb 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Meilleure réponse
Messages postés
2381
Date d'inscription
jeudi 12 juillet 2001
Dernière intervention
13 février 2015
- 9 mars 2006 à 19:54
3
Merci
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

Merci cs_Willi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 86 internautes ce mois-ci

Messages postés
6
Date d'inscription
mercredi 6 février 2002
Dernière intervention
10 mars 2006
- 10 mars 2006 à 07:15
0
Merci
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
Dernière intervention
4 février 2007
- 4 févr. 2007 à 07:52
0
Merci
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.