IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Framework .NET Discussion :

[2.0] Comment recuperer des données d'un BackgroundWorker (autre que le %) ?


Sujet :

Framework .NET

  1. #1
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Points
    104
    Par défaut [2.0] Comment recuperer des données d'un BackgroundWorker (autre que le %) ?
    Bonjour,

    j'utilise un backgroundworker pour ecouter un port, et recuperer une trame UDP.
    Cette trame contient des infos envoyée par un serveur.

    Mais une fois ces infos recues, je ne sais pas quoi en faire (car on ne peux pas envoyer des infos a la form)... je peux changer le pourcentage d'avancement, mais cela ne m'aide gere....

    Je suppose qu'il faille utiliser un thread plutot qu'un background worker (?)....

    merci de me donner un petit coup de main

  2. #2
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    Je pense que tu auras effectivement plus de souplesse en utilisant les threads. Tu execute une méthode de ton objet dans un thread et tu te sert des propriétés de ton objet pour passer/récupérer des paramétres à ton objet.

    Regarde ici :

    http://faqvbnet.developpez.com/?page...d#thread_param

    Après pour pouvoir mettre à jour ta form à partir du thread, il faut passer par un délégué défini dans ta form que tu appele à partir de ton thread

  3. #3
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Points
    104
    Par défaut
    ok, je vais essayer ca, c vrai que le thread a l'avantage (par rapport au backgroundworker) de pouvoir etre annulé immédiatement avec .abord ...

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 95
    Points : 350
    Points
    350
    Par défaut
    Citation Envoyé par MattC
    ok, je vais essayer ca, c vrai que le thread a l'avantage (par rapport au backgroundworker) de pouvoir etre annulé immédiatement avec .abord ...
    Tu peux le faire également avec le BackGroundWorker :

    http://glarde.developpez.com/dotnet/bgworker/

    méthode CancelAsync.

  5. #5
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Points
    104
    Par défaut
    ben nan c pas pareil... la il faut attendre que le code gère l'annulation ... On demande l'annulation, mais l'annulation ne se fait pas immédiatement...

    Citation Envoyé par Angath
    Je pense que tu auras effectivement plus de souplesse en utilisant les threads. Tu execute une méthode de ton objet dans un thread et tu te sert des propriétés de ton objet pour passer/récupérer des paramétres à ton objet.

    Regarde ici :

    http://faqvbnet.developpez.com/?page...d#thread_param

    Après pour pouvoir mettre à jour ta form à partir du thread, il faut passer par un délégué défini dans ta form que tu appele à partir de ton thread
    je l'ai fait, mais j'ai le meme probleme qu'avec un BackgroundWorker... il me dis que ce n'est pas safethread....
    "Opération inter-threads non valide*: le contrôle 'Label1' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé."

    Alors que le code executé est bien sur la form, et est appelé par le thread, qui a eu la form en parametre....

    bon moi je vais craquer la.... je vais mettre a "false" ce p**** de CheckForIllegalCrossThreadCalls .....

  6. #6
    Membre habitué Avatar de Angath
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    140
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2004
    Messages : 140
    Points : 174
    Points
    174
    Par défaut
    As tu déclarer un delegate dans ta form ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Public Delegate Sub MajLabelHandler(ByVal Etat As String)
        Public MajLabel As New MajLabelHandler(AddressOf MajLabel)
    Tu déclare après la Sub MajLabel dans ta form :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       Private Sub MajLabel(ByVal Etat As String)
     
            Me.MyLabel.Text = Etat
     
       End Sub
    Ensuite tu instancie ton objet qui contient la procédure à executer dans un thread (oublie pas de passer ta form en parametre pour pouvoir invoker le delegate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Dim myObject as new MyObjectThread(...,...,ME)
        Dim myThread as new Thread(addressOf myObject.TaFonction)
        myThread.Start()
    Quand tu veux mettre à jour ton label tu appel le délégate de ta form à partir de ton thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      Public Class myObjectThread     
           Private _form As Form1
           Public Sub New(..., ..., myForm As Form1)
                _form = myForm
           End Sub
     
           Public Sub TaFonction()
              ...
              _form.Invoke(_form.MajLabel,"Ca Marche")      
              ...
           End sub
       End class
    J'ai une appli, qui lance un traitement en thread, et je met à jour ma form pour le suivi du thread comme ca. Ca marche très bien

    Regarde dans MSDN, en cherchant Thread, tu retrouvera le même type d'exemple.

  7. #7
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Points
    104
    Par défaut
    ok génial ca marche. Effectivement, j'avais pas mis le delegate, je croyais que le fait que la methode soit dans la bonne classe suffisais...

    par contre, il faudrai juste que tu modifie ton code, ne pas mettre :
    Public MajLabel As New MajLabelHandler(AddressOf MajLabel)

    mais
    Public MajLabel As New MajLabelHandler(AddressOf MajCompress)


    Merci bcp !

  8. #8
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par MattC
    bon moi je vais craquer la.... je vais mettre a "false" ce p**** de CheckForIllegalCrossThreadCalls .....
    Justement pourquoi ne pas l'avoir fait dès le départ?

  9. #9
    Membre régulier

    Inscrit en
    Décembre 2004
    Messages
    85
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 85
    Points : 104
    Points
    104
    Par défaut
    parceque j'arrete pas de lire partout que c'est mal, et que c'est pas en "tuant le messager" que la mauvaise nouvelle va disparaitre....

    Moi j'étais bien tenté... mais je voulais faire ca proprement...

  10. #10
    Rédacteur
    Avatar de abelman
    Inscrit en
    Février 2003
    Messages
    1 106
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 1 106
    Points : 2 629
    Points
    2 629
    Par défaut
    Citation Envoyé par MattC
    parceque j'arrete pas de lire partout que c'est mal, et que c'est pas en "tuant le messager" que la mauvaise nouvelle va disparaitre....
    Pas mal celle là je la garde au chaud
    @+

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] comment recuperer des données saisies dans un formulaire?
    Par adel25 dans le forum Symfony
    Réponses: 6
    Dernier message: 29/08/2013, 16h19
  2. Réponses: 2
    Dernier message: 11/04/2009, 17h29
  3. Comment récuperer des données entrées au clavier?
    Par Elisée A. dans le forum MFC
    Réponses: 2
    Dernier message: 13/02/2004, 07h22
  4. Réponses: 2
    Dernier message: 19/01/2004, 12h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo