OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 2007
-
1 mai 2007 à 17:35
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 2007
-
5 mai 2007 à 21:14
Comment ne pas avoir une erreur dans le code d'un thread sans utiliser CheckForIllegalCrossThreadCalls = False ?
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 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
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 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
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 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 ?
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.
cs_Willi
Messages postés2375Date d'inscriptionjeudi 12 juillet 2001StatutModérateurDernière intervention15 décembre 201822 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
OneHacker
Messages postés1447Date d'inscriptionjeudi 2 novembre 2000StatutMembreDernière intervention23 septembre 20072 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.