Cross thread operation not valid [Résolu]

Messages postés
3249
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
- - Dernière réponse : cs_ShayW
Messages postés
3249
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 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
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_lim
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_lim
Messages postés
3249
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46
0
Merci
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
Commenter la réponse de cs_ShayW
Messages postés
329
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
10 mai 2014
4
0
Merci
RE

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

un tuto sur les délégué

@+LIM
Commenter la réponse de cs_lim
Messages postés
3249
Date d'inscription
jeudi 26 novembre 2009
Statut
Membre
Dernière intervention
16 octobre 2019
46
0
Merci
je suis entrain de le lire
Commenter la réponse de cs_ShayW