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
41
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
41
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