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 ?
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
Messages postés15048Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 mars 2023156 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...
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
Messages postés15048Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 mars 2023156 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 ...
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
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
Messages postés15048Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention19 mars 2023156 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 ?
12 nov. 2014 à 20:47
Remplaces le "ctl.Enabled = enabled" par ce que tu as besoin.
Les 2 lignes importantes, c'est le IF ... Then et le ...BeginInvoke...
12 nov. 2014 à 21:41
je l'appelle comme ceux-ci
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
12 nov. 2014 à 23:19
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 ...
13 nov. 2014 à 12:33
un grand merci pour ton aide =)