Thread Safe [Résolu]

Signaler
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
-
OneHacker
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
-
Comment ne pas avoir une erreur dans le code d'un thread sans utiliser  CheckForIllegalCrossThreadCalls = False ?

Redman

12 réponses

Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
17
Fournit nous ton code l'exemple sera plus concret.
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
Oh pardon, j'oublié de préciser que je programme en VB.NET 2005 framework 2.0.
Et que le code est dans la procédure apellée par le thread.

Redman
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
32
Je dirais à priori en tentant de localiser, identifer, et corriger le code à l'origine de l'erreur.

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
17
Bonjour,
En utilisant un délégué car sous .net 2 tu ne peux pas dans un thread appelé des objets créer à partir d'un autre thread.
Voir ici un exemple http://www.developpez.net/forums/archive/index.php/t-118709.html

++
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
Merci mais c'est pas clair l'histoire de délégue si t'a un exemple plus facile je suis prenant.

Redman
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
' Code pour l'appel du thread :




Dim tValue As New Threading.Thread(AddressOf Envoyer)
tValue.Start()

' Procédure 

Private Sub Envoyer()
For i As Integer = 1 To nudNB.Value

   nudNB.Value -= 1

Next
End Sub

nudValue est un Numeric UpDown et j'utilise cela à partir d'un tValue
que j'initialise comme ceci tValue.

A la ligne "nudNB.Value -= 1" ca me lève l'erreur "System.InvalidOperationException : Opération inter-threads invalide : le contrôle a fait l'objetd'un accès à partir d'un thread autre que sur lequel il a été géré"

Alors que c'est dans le même thread que je modifie la valeur nudNB.Value

Redman
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
17
Normal ton erreur nudNB.Value -=1, nudNB n'appartient à ton thread démarré par tValue.

Pour se faire en .net 2 on utilisera un délégué.
private delegate sub EnvoyerHandler()

Dans ta méthode Envoyer intancie ton délégué
private sub envoyer()
   dim del as new EnvoyerHandler(AddressOf ProcEnvoyer)
   me.BeginInvoke(del)
end sub

Puis une nouvelle méthode ProcEnvoyer qui se chargera de traiter avec les objets créés par ton thread principal
private sub ProcEnvoyer()
   For i As Integer = 1 To nudNB.Value
      nudNB.Value -= 1
   Next

end sub

++
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
Merci beaucoup Will j'ai testé avec un BackGroundWorker sur une form et ça marche mais si dans l'éevènement FormClosing de la form je met ce code (BW-> BackgroundWorker) :

If BW.IsBusy Then ' Si BW est occupé
    BW.CancelAsync() ' Arrête le thread asynchrone
End If

Est-ce que c'est suffisant pour stopper l'opération si elle est en cours ?

Redman
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
17
Bonjour,
Oui cela est suffisant, plus d'info sur MSDN BackgroundWorkder.CancelAsync

Mais une chose qui me surprend le composant BackgroundWorker est fait pour éviter d'utiliser les délgués. Normalement dans ton cas sa doit tourner dans le backgroundworker sans rien faire de spécial.
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
32
Il semblerais bien qu'il faille utiliser les délégués aussi avec le BackGroundWorker

C'est du moins ce que j'en ai déduis lors de mes recherche pour répondre à ce topic :

http://www.vbfrance.com/infomsg_BACKGROUNDWORKER-RECUPERER-MODIFIER-CONTROLES-TEXTBOX-COMBOBOX_933516.aspx#4

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
Messages postés
2376
Date d'inscription
jeudi 12 juillet 2001
Statut
Modérateur
Dernière intervention
15 décembre 2018
17
Casy, non au contraire le Backgroundworker execute notre traitement dans le thread principal donc pas besoin de délégué.
OneHacker sert toi de cet exemple
Messages postés
1466
Date d'inscription
jeudi 2 novembre 2000
Statut
Membre
Dernière intervention
23 septembre 2007
1
Casy dans ton topic rien ne parle de l'erreur dont j'ai parlé et Willi pareil ton topic ne parle à aucun moment donné de comment éviter mon problème par contre il montre la même erreur que j'ai eu mais avec ldes délégués ca marche.

Redman