Thread Safe

Résolu
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 - 1 mai 2007 à 17:35
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 - 5 mai 2007 à 21:14
Comment ne pas avoir une erreur dans le code d'un thread sans utiliser  CheckForIllegalCrossThreadCalls = False ?

Redman

12 réponses

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
1 mai 2007 à 22:41
Fournit nous ton code l'exemple sera plus concret.
3
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
1 mai 2007 à 17:36
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
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
1 mai 2007 à 17:53
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 #
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
1 mai 2007 à 18:01
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

++
0

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

Posez votre question
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
1 mai 2007 à 22:34
Merci mais c'est pas clair l'histoire de délégue si t'a un exemple plus facile je suis prenant.

Redman
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
2 mai 2007 à 00:43
' 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
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
2 mai 2007 à 10:54
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

++
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
4 mai 2007 à 11:04
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
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
4 mai 2007 à 13:44
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.
0
cs_casy Messages postés 7741 Date d'inscription mercredi 1 septembre 2004 Statut Membre Dernière intervention 24 septembre 2014 40
4 mai 2007 à 13:56
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 #
0
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
4 mai 2007 à 14:29
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
0
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
5 mai 2007 à 21:14
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
0
Rejoignez-nous