guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 2013
-
3 févr. 2011 à 12:25
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024
-
5 févr. 2011 à 18:09
Bonjour à toutes et tous,
Voici mon problème, j'ai une application avec un certain nombre de fonctionnalités, cependant une d'entre elle doit tourner en boucle tout le temps.
J'ai essayé avec un timer (partiellement mis à jour et bloqué le reste du temps) y compris avec des DoEvents !
Sur le forum j'ai trouvé le contrôle BackgroundWorker mais je n'arrive pas à le faire fonctionner correctement.
Ce que je veux que ma tâche de fond fasse c'est ce qu'il y a dans un Bouton.
Private Sub MonBouton_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MonBouton.Click
Action1()
Action2()
End Sub
Private Sub frmMain_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
On Error Resume Next
Do
Action1()
Action2()
Loop
End Sub
Le problème c'est que cela ne fonctionne toujours pas !
Je ne vois pas ce qui est incorrect !
Pour information dans Action1() il y a des contrôles se trouvant sur la form1 qui sont mis à jour !
Si quelqu'un pouvait me sortir de ce mauvais pas ...
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 3 févr. 2011 à 13:59
Bonjour NHenry,
En fait ces actions sont censées 'écouter' les ports USB de mon PC et m'indiquer si un nouveau périphérique est connecté ou déconnecté !
Comme cela doit être effectif en temps réel, il faut que l'écoute soit permanente.
Mon IHM ne se fige plus (uniquement avec un Timer) mais je n'ai aucun retour de ma tâche de fond, en mode pas à pas il détecte bien la présence ou non du périphérique mais ne retranscrit pas le résultat.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 3 févr. 2011 à 19:10
Bonjour,
Comment tu retranscrit le résultat ?
As-tu vérifier que tu n'arrive pas à une exception CrossThread ? (si tu mets à jour l'interface à partir de ton thread)
Sinon, je ne vois pas, désolé.
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 4 févr. 2011 à 09:13
Bonjour NHenry,
Aurais-tu un exemple commenté de ce que tu me dis là ? J'utilise pour la première fois ce composant et j'avoue que je n'ai pas compris toutes ces subtilités.
Par avance merci
Olivier
Vous n’avez pas trouvé la réponse que vous recherchez ?
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 5 févr. 2011 à 17:14
Bonjour,
Je n'ai pas spécialement de code concernant ce contrôle (je l'utilise très rarement), mais, la question est simple :
Est-ce que dans le code du thread, tu tente de modifier l'interface de ton application, avec des instructions du genre :
MaForm.MonLabel.Text=MonTexte
?
guilleto
Messages postés256Date d'inscriptionjeudi 23 octobre 2003StatutMembreDernière intervention20 mars 20131 5 févr. 2011 à 18:01
Bonjour,
Je dirais OUI, quand je reçois l'information, je dois modifier le contenu d'une ListBox par un effacement du contenu puis en ajoutant le cas échéant l'information qui m'intéresse.
Lorsque j'essaie en mode pas à pas, l'information (ou le manque d'information) est correcte mais l'affichage ne suis pas !
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 5 févr. 2011 à 18:09
Bonjour,
Donc, je suppose que c'est un problème à ce niveau, dans .NET, depuis la version 2 (2005), les appels de ce type à partir de thread est bloqué, afin de protéger contre des états indéterminés (il y a des caches pour accélérer les traitementse, faire des appels interthreads, peut causer un peoblème (2 threads ont 2 valeurs différentes pour la même variable, j'ai déjà eu le cas).
Dans ce cas, il faut appeller la méthode Invoke de la Form avec un Delegate adapté :
MaForm.Invoke(New DelegateSub(Address Of MaSub))
Pour plus d'options, l'aide te fournira plus d'info et sur internet, il faut rechercher : Cross thread calls.