Problème sur le contrôle BackgroundWorker !

guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 - 3 févr. 2011 à 12:25
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 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 ...

Par avance merci

Olivier

7 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
3 févr. 2011 à 12:56
Bonjour,

1 choses :
- On Error Resume Next
PLUS DE On Error en .NET, utilises Try/Catch

Questions :
- Que sont sensé faire ces actions ?
- Les fonctions sont actives ?
- Ton IHM se fige toujours ?

Mon site
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
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.

Merci d'avance

Olivier
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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é.

Mon site
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
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
0

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

Posez votre question
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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
?

Mon site
0
guilleto Messages postés 256 Date d'inscription jeudi 23 octobre 2003 Statut Membre Dernière intervention 20 mars 2013 1
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 !

Par avance merci

Olivier
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
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.

Mon site
0
Rejoignez-nous