Cross thread operation not valid

Résolu
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 7 déc. 2011 à 19:46
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 - 8 déc. 2011 à 11:53
Bonjour à tous

J'utilise le backgroundWorker
Private Sub backgroundWorker1_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles backgroundWorker1.DoWork
  sub1()
  sub2()
        Try
            Buttonsolution.Enabled = True
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
 End Sub


une exception a été relevé

cross thread operation invalid:control
"buttonsolution" accessed from a thread other
than the thread it was created on


Merci
A voir également:

5 réponses

cs_lim Messages postés 329 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 10 mai 2014 7
8 déc. 2011 à 08:36
Salut

Ta form est un Thread, ton BackgroundWorker est un autre Thread, il ne peut pas accéder aux objets de ta form.

Solution : déclaration d'un délégué qui va permettre l'interaction entre les Threads.

La fonction pour mettre à true ton bouton
Public Function MettreTrueBouton() as Boolean
    Buttonsolution.Enabled = True
    Return True
End Function



Déclaration du délégué
Le délégué doit avoir les mêmes arguments et le même type de retour que la fonction qu'il délègue.
Delegate Function Delegate_MettreTrueBouton() as Boolean

Déclaration de l'instance du délégué
Public Instance_MettreTrueBouton as TAFORM.Delegate_MettreTrueBouton = New Delegate_MettreTrueBouton(AddressOf Me.MettreTrueBouton)


Dans ton BackGroundWorker à la place de button.enabled=true mettre
Me.Invoke(Instance_MettreTrueBouton)


Une fois tout ceci fait ton backgroundworker pourra interagir avec le bouton de ta form.


@+LIM
3
cs_lim Messages postés 329 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 10 mai 2014 7
8 déc. 2011 à 11:36
Re

Pour la définition d'un Delegate :

http://www.developerfusion.com/article/5251/delegates-in-vbnet/

A delegate can be defined as a type safe function pointer. It encapsulates the memory address of a function in your code. Whenever you create or use an event in code, you are using a delegate. When the event is thrown, the framework examines the delegate behind the event and then calls the function that the delegate points to. As we will see later, delegates can be combined to form groups of functions that can be called together.


je te laisse traduire

@+LIM
3
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
8 déc. 2011 à 11:07
Bonjour Lim

j'ai déclaré tout en private cela fonctionne aussi
si je comprends
Delegate Function Delegate_MettreTrueBouton() as Boolean

est un pointer de l'addresse de la fonction
MettreTrueBouton()
ce qui va permettre à un autre thread d'y acceder
0
cs_lim Messages postés 329 Date d'inscription jeudi 20 novembre 2003 Statut Membre Dernière intervention 10 mai 2014 7
8 déc. 2011 à 11:39
RE

toujours en anglais : http://msdn.microsoft.com/en-us/library/Aa288459

un tuto sur les délégué

@+LIM
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
8 déc. 2011 à 11:53
je suis entrain de le lire
0
Rejoignez-nous