Multithread: probleme de cross-threading avec un contrôle
neo2k2
Messages postés126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 2009
-
9 mars 2009 à 14:14
neo2k2
Messages postés126Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention 9 novembre 2009
-
10 mars 2009 à 08:41
Bonjour à tous,
Je débute avec les thread et je me trouve confronté à un petit problème que je n'arrive pas à résoudre.
Dans une Form, j'ai une procédure d'ouverture de fichier (pas du tout optimisée):
Private
Sub OpenFile()
Dim i
As
Integer = 1
Dim monStreamReader
As
New StreamReader(
Me.txtFileA.Text())
'Stream pour la lecture
Dim ligne
As
String
' Variable contenant le texte de la ligne
Do
While
Trueligne = monStreamReader.ReadLine()
Me.TextBox1.Text =
Me.TextBox1.Text & ligne
' FormMain.TextBox1.Refresh()
Loop
' Until ligne Is NothingmonStreamReader.Close()
End
Sub
Et j'ai un thread qui théoriquement lance cette procédure pour ouvrir des fichiers de plusieurs Mb:
Private
Sub btnOpenFile_Click(
ByVal sender
As System.Object,
ByVal e
As System.EventArgs)
Handles btnOpenFile.Click
' cree un nouveau thread pour economiser le processus
Dim t
As Threadt =
New Thread(
New ThreadStart(
AddressOf OpenFile))t.Start()
Catch ex
As ExceptionMsgBox(
"Une erreur est survenue au cours de l'acces en lecture du fichier." & vbCrLf & vbCrLf &
"Veuillez verifier l'emplacement : " & fichier, MsgBoxStyle.Critical,
"Errueur lors de l'ouverture du fichier...")
End
Try
End
If
End
Using
End
Sub
A priori rien de bien sorcier mais voila le message d'erreur que j'obtiens:
"Cross-thread operation not valid: Control 'TextBox1' accessed from a thread other than the thread it was created on."
Si l'un de vous a le courage de m'expliquer... Merci d'avance.
A voir également:
Multithread: probleme de cross-threading avec un contrôle
lesdis
Messages postés403Date d'inscriptionmercredi 19 avril 2006StatutMembreDernière intervention 7 août 2020 9 mars 2009 à 14:29
Bonjour,
Le controle Textbox1 appartient au thread principal de ta form, tandis que ton ouverture de fichier se fait sur un thread séparé. Pour accéder au thread principal, il va falloir passer par les délégués.
Petit exemple :
Private sub delegate _Affiche(Texte as string)
Private sub Affiche(Texte as string)
Textbox1.text = textbox1.text & Texte
End sub
Private sub OpenFile()
'Ton traitement
me.invoke(new _Affiche(AdressOf Affiche),Texte) 'Création d'un nouveau délégué pointant vers Affiche et appel de celui par la form
End sub
Tout est fait de tete, il peut y avoir des erreurs.
Je te conseille de te renseigner sur les délégués pour bien comprendre le fonctionnement