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

C# Discussion :

backgroundworker et plusieurs arguments [Débutant]


Sujet :

C#

  1. #1
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut backgroundworker et plusieurs arguments
    Bonjour

    J'utilise une dll de chez FTDI pour causer sur l'usb à un périphérique particulier.
    J'attends (potentiellement assez longtemps) la réception de données dans un buffer avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftStatus = ftdiDevice.Read(InBuffer, 128, ref ftRead);
    Afin de ne pas bloquer mon application pendant l'attente (et pouvoir y ajouter ensuite une annulation et un timeout), je voudrais faire tourner cette ligne dans un backgroundworker.

    Mon soucis c'est qu'il me faudrait pouvoir passer en paramètre le 128 (le nombre d'octets attendus) ET le ftdiDevice, l'objet de la classe FTDI instancié auparavant.

    Actuellement j'arrive à passer un argument au DoWork mais pas plusieurs, qui plus est ont des types tordus (FTDI et Uint)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ftStatus = backgroundWorkerOrdre.RunWorkerAsync(ftdiDevice, 128);
    Comment faire ?

    Merci par avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le backgroundworker ne permet de passer qu'un seul paramètre (object donc n'importe quoi)

    après si tu regardes bien, sur les évènements, microsoft arrive à passer plusieurs paramètres en un seul, dans e il y a des dérivés de EventArgs

    il suffit donc de faire pareil, à savoir faire une classe avec les propriétés qu'il te faut, puis créer une instance dans le dowork
    sur l'event il suffit de caster
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    Merci pour la réponse
    Citation Envoyé par Pol63 Voir le message
    après si tu regardes bien, sur les évènements, microsoft arrive à passer plusieurs paramètres en un seul, dans e il y a des dérivés de EventArgs

    il suffit donc de faire pareil, à savoir faire une classe avec les propriétés qu'il te faut, puis créer une instance dans le dowork
    sur l'event il suffit de caster
    euhhh, là ca va un peu vite pour moi.

    J'ai déjà l'impression d'ajouter des tonnes et des tonnes de fonctions, avec des trucs qui partent dans tous les sens, juste pour utiliser une tache de fond. Je dois reconnaitre que là l'idée de créer un fichier en plus me fait carrément peur !

    Je ne suis pas bien à l'aise avec la notion de classe. Le fait de caster sur un seul argument, c'est l'idée de faire une structure qui serait passée en paramètre et qui contiendrait tous mes paramètres ?
    Il faut créer une classe parce qu'une telle structure ne peut se faire dans ma classe "principale" ?

    Merci

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    Citation Envoyé par petitours Voir le message
    J'ai déjà l'impression d'ajouter des tonnes et des tonnes de fonctions, avec des trucs qui partent dans tous les sens, juste pour utiliser une tache de fond. Je dois reconnaitre que là l'idée de créer un fichier en plus me fait carrément peur !
    coder c'est coder, ajouter des fichiers n'a rien de grave ^^
    par contre pour utiliser un backgroundworker il ne faut que quelques lignes de code normalement


    Citation Envoyé par petitours Voir le message
    Je ne suis pas bien à l'aise avec la notion de classe. Le fait de caster sur un seul argument, c'est l'idée de faire une structure qui serait passée en paramètre et qui contiendrait tous mes paramètres ?
    Il faut créer une classe parce qu'une telle structure ne peut se faire dans ma classe "principale" ?
    dans visual studio on peut ajouter autant de fichier qu'on veut, et les trier via des dossiers
    tu peux donc faire un fichier contenant la classe (un peu comme une structure oui) que tu utiliseras
    mais tu peux aussi mettre la classe en private dans la classe d'un form vu qu'il ne faut normalement que 5 lignes de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private class BgwArg {
         public string prop1 { get; set; }
         public int64 prop2 { get; set; }
     }
    dans l'event du bgw :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BgwArg variable = (BgwArg)e.jesaisplusquoi;
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre extrêmement actif Avatar de petitours
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2003
    Messages
    2 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2003
    Messages : 2 037
    Par défaut
    J'ai réussi !!

    j'ai créé une classe que j'ai ajouté en bas de la class de mon form
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
        class ClasseBGparam
        {
            private FTDI m_MyFTDI;
            private int m_NboctetArecevoir;
     
            public ClasseBGparam() { }
     
            public FTDI MyFTDI
            {
                get { return m_MyFTDI; }
                set { m_MyFTDI = value; }
            }
     
            public int NboctetArecevoir
            {
                get { return m_NboctetArecevoir; }
                set { m_NboctetArecevoir = value; }
            }
        }
    (j'ai trouvé un exemple qui ressemblait à mon besoin en me basant sur ces super explications)

    et ainsi j'ai pu appeler mon backgroundworker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ClasseBGparam thisClass = new ClasseBGparam();
                thisClass.MyFTDI = ftdiDevice ;
                thisClass.NboctetArecevoir = 128;
     
                backgroundWorkerOrdre.RunWorkerAsync(thisClass);
    et récupérer mes 2 paramètres dans le backgroundworker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ClasseBGparam args = (ClasseBGparam)e.Argument;
                ftStatus = args.MyFTDI.Read(InBuffer, (uint)args.NboctetArecevoir, ref ftRead);
    Il me reste à trouver comment découper ma monstrueuse class de mon Form en différents petits fichiers au nom intelligible parce que là ça devient vraiment vilain...

    Merci beaucoup

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

Discussions similaires

  1. callback avec plusieurs arguments
    Par Claiw dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 23/12/2006, 18h46
  2. Réponses: 3
    Dernier message: 25/07/2006, 09h25
  3. switch avec plusieurs arguments
    Par lazzeroni dans le forum Langage
    Réponses: 4
    Dernier message: 18/07/2006, 13h34
  4. Réponses: 8
    Dernier message: 30/05/2005, 13h55
  5. [debutant] [main] plusieurs arguments
    Par naive dude dans le forum Langage
    Réponses: 9
    Dernier message: 28/09/2004, 09h20

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