Multi thread

Résolu
Rykudos - 9 nov. 2014 à 13:50
 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 ?

2 réponses

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
9 nov. 2014 à 14:41
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


0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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...
0
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
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 ...
0
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 =)
0
Rejoignez-nous