Multithread: probleme de cross-threading avec un contrôle

neo2k2 Messages postés 126 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 - 9 mars 2009 à 14:14
neo2k2 Messages postés 126 Date d'inscription jeudi 16 janvier 2003 Statut Membre Derniè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

Using OpenDial
As
New OpenFileDialog

If (OpenDial.ShowDialog = Windows.Forms.DialogResult.OK) ThenOpenDial.Filter "Text files (*.txt)|*.txt|All files (*.*)|*.*"txtFileA.Text OpenDial.FileName

Try

' 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.

3 réponses

lesdis Messages postés 403 Date d'inscription mercredi 19 avril 2006 Statut Membre Derniè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

Bonne Prog
1
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
9 mars 2009 à 16:20
Tu peux désactiver le contrôle des appels de thread avec la propriété CheckForIllegalCrossThreadCalls.
Me.CheckForIllegalCrossThreadCalls = False

Ceci est une autre méthode bonne à savoir mais évite de l'utiliser.
0
neo2k2 Messages postés 126 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 9 novembre 2009 3
10 mars 2009 à 08:41
Je vais tester les 2 solutions, de toute façon il faut que je comprenne les threads (bien que j'aie déjà lu la faq msdn sur le sujet).

Merci, je vous redis.
0
Rejoignez-nous