Multi thread [Résolu]

Rykudos - 9 nov. 2014 à 13:50 - Dernière réponse :  Rykudos
- 13 nov. 2014 à 12:33
Bonjour,
afin d'améliorer la performance de mes programmes je me lance dans le multi thread, mais je rencontre un souci lorsque je souhaite récupérer ou modifier la valeur d'un control (ex : textbox) d'une form autre que celle d'où j'ai exécuter mon thread.


Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Thread1 As New System.Threading.Thread(AddressOf test)
Thread1.Start()
Thread1.Join()
MsgBox("fin")
End Sub

Public Sub test()
TextBox1.Text = Form2.TextBox1.Text
End Sub

End Class


Informations supplémentaires : Opération inter-threads non valide : le contrôle 'TextBox1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

même problème avec backgroundworker =/

ma question est donc la suivante est-il possible de récupéré la valeur du textbox ou est ce qu'il faut que j'enregistre sa valeur dans un fichier pour ensuite la récupéré via le fichier dans le thread ?
Afficher la suite 

Votre réponse

8 réponses

NHenry 14203 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 17 juin 2018 Dernière intervention - 9 nov. 2014 à 14:41
0
Merci
Bonjour,



Je te recommande cette solution :
https://stackoverflow.com/questions/2240702/crossthread-operation-not-valid-vb-net

Plus particulièrement la solution de : Fredrik Mörk
Private Sub SetControlEnabled(ByVal ctl As Control, ByVal enabled As Boolean)
    If ctl.InvokeRequired Then
        ctl.BeginInvoke(New Action(Of Control, Boolean)(AddressOf SetControlEnabled), ctl, enabled)
    Else
        ctl.Enabled = enabled
    End If
End Sub


NHenry 14203 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 17 juin 2018 Dernière intervention - 12 nov. 2014 à 20:47
Ce bout de code te montre comment utiliser une méthode pour agir sur tes contrôles.
Remplaces le "ctl.Enabled = enabled" par ce que tu as besoin.
Les 2 lignes importantes, c'est le IF ... Then et le ...BeginInvoke...
je l'adapte comme ceux-ci


Private Sub recuptext(ByVal ctl As Control, ByVal text As Boolean)
If ctl.InvokeRequired Then
ctl.BeginInvoke(New Action(Of Control, Boolean)(AddressOf recuptext), ctl, text)
Else
TextBox1.Text = ctl.Text
End If
End Sub




je l'appelle comme ceux-ci


recuptext(Form2.TextBox1, False)



si je l'appelle avant d'exécuter mon thread sa fonctionne bien, mais si je l'appelle pendant le thread sa me retourne la même erreur
NHenry 14203 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 17 juin 2018 Dernière intervention - 12 nov. 2014 à 23:19
TextBox1.Text = ctl.Text
Déjà ce serait
ctl.Text=text
Ou alors tu retires le paramètre
ctl As Control
de ta fonction./

Ensuite, Text est une propriété qui demande une string, pas un booléen ...
c bon j'ai réussi


Public Class Form1


Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click


Dim Thread1 As New System.Threading.Thread(AddressOf test)
Thread1.Start()
Thread1.Join()
'MsgBox("fin")
End Sub

Public Sub test()
recuptext(TextBox1, "azerty")

End Sub



Private Sub recuptext(ByVal ctl As Control, ByVal text As String)
If ctl.InvokeRequired Then
ctl.BeginInvoke(New Action(Of Control, String)(AddressOf recuptext), ctl, text)

Else
ctl.Text = text
MsgBox(text)
'''''
' text = Form2.TextBox1.Text
' ctl.Text = text
'''''
Form2.TextBox1.Text = text

End If
End Sub

End Class



un grand merci pour ton aide =)
Commenter la réponse de NHenry
0
Merci
merci pour la rapidité de ta réponse, problème résolu grâce au lien que tu ma fourni.

en ajoutant le code ci-dessous au démarrage de la form qui exécute le thread, j'obtiens la valeur du textbox de la form2 dans le textbox de la form1


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
End Sub



par-contre je ne peut pas marquer comme résolut
NHenry 14203 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 17 juin 2018 Dernière intervention - 9 nov. 2014 à 15:42
"System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False"
Est à éviter, car les opérations inter-threads peuvent déboucher sur une incohérence d'état des controles.
TOUJOURS laisser ce contrôle.
Effectivement j'ai essayer de l'adapter a l'un de mes programme mais sa provoque quelque bug, du coup j'ai essayer la solution que tu ma proposer mais je n'arrive pas a l'adapter a mon cas. Enabled ce n'est pas pour activer ou non un control ?
Commenter la réponse de Rykudos

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.