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

Windows Forms Discussion :

Delegate dans une classe


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut Delegate dans une classe
    Bonjour à tous,

    J'ai une question existentielle sur les cross thread operations.

    Contexte:
    Je développe actuellement une classe de gestion d'un lecteur codes à barres pour appareils mobiles.
    Cette classe référence une DLL du SDK du fournisseur hardware.
    Cette DLL englobe des classes de gestion dont ma classe va se servir.
    Parmis les classes du SDK, celle de gestion du lecteur barcode semble tourner dans une thread à part. Cette thread renvoie donc un évènement vers ma classe de gestion à chaque lecture.
    Ma classe de gestion a pour but de relancer cet évènement vers la ou les forms abonnées.

    Problème:
    La valeur reçue par ma form provient donc d'un thread séparé. (celui de la DLL)
    Lorsque je veux afficher la valeur reçue dans l'évènement sur ma form, l'erreur fatalistiquement agaçante "Cross thread operation" se pointe.

    Je me doute évidement qu'il me suffirait de placer dans chaque form s'abonnant à cette classe un Délégué qui se chargera de passer ma données d'un thread à ma form.

    Souhait:M'abstraire de cette contrainte au niveau de ma form en "déthreadisant" cette donnée directement dans ma classe.

    Cela me permettrait d'éviter le délégué sur chaque form et simplifierais au maximum la gestion du lecteur codes à barres.



    Je remercie d'avance toutes les idées, bonnes ou mauvaises, pouvant m'aider à atteindre la lumière

    Bonne soirée.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Regarde du côté des classes AsyncOperationManager et AsyncOperation. Cela devrait correspondre à ce que tu veux.

    Sinon sur chaque form cela peut rester relativement simple. Pas besoin de délégué, un de ceux fourni par défaut (MethodInvoker) et une méthode anonyme suffisent. Il me semble que les méthodes anonymes sont disponibles en VB.Net maintenant, avec les lambda expression, mais je n'en suis pas très sûr.

    En C# cela donnerait ceci pour la méthode chargée de gérer l'invoke
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void InvokeMethod(MethodInvoker invoker)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(invoker);
        }
        else
        {
            invoker();
        }
    }
    Tu peux éventuellement en faire une méthode statique et la mettre dans une classe utilitaire. Il suffit d'ajouter en argument de la méthode l'instance du formulaire à manipuler.

    Pour l'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvokeMethod(delegate { this.textBox1.Text = "..."; });
    Pas de questions techniques par MP

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    si tu récupère le code barre dans une classe à toi et qu'ensuite tu lève un évènement par exemple j'ai une solution


    y a une méthode qu'a l'air moyennement propre mais qui à mon avis peut etre considérée comme propre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public event CodeBarreLu(codebarre as long)
     
    public delegate sub DelegateOnCodeBarreLu (codebarre as long)
     
    private sub OnCodeBarreLu(codebarre as long)
      if system.windows.application.openforms(0).invokerequired then
        dim d as new DelegateOnCodeBarreLu (adressof OnCodeBarreLu)
        system.windows.application.openforms(0).invoke(d,codebarre)
        exit sub
      end if
     
     raiseevent CodeBarreLu (codebarre)
    end sub
    ca part du principe qu'au moins une form est ouverte ^^
    et l'event est toujours sur le thread principal du coup

    par contre reste à voir si tout ce que j'utilise existe sur le compactframework
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Points : 156
    Points
    156
    Par défaut
    Bonjour et merci pour vos idées.

    Malheureusement, aucun des solutions proposées n'est exploitable du côté Compact Framework.

    Je vais regarder pour créer un délégué sur chacune de mes forms qui exploite cette classe.

    PS: La solution pas propre du tout: checkForIllegalCrossThreadOperation = false mais ca ne me convient pas lol.
    WebAgency www.cpstyle.net
    BncAgency www.bncmasters.net

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/07/2005, 23h10
  2. classe dans une classe ?
    Par tut dans le forum UML
    Réponses: 23
    Dernier message: 25/06/2004, 15h00
  3. [Thread] Erreur dans une classe interne
    Par totof2308 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/06/2004, 08h15
  4. Thread dans une classe ?
    Par Sephi dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 07/03/2004, 18h16
  5. Fonction callback dans une classe
    Par julian_ross dans le forum MFC
    Réponses: 8
    Dernier message: 02/03/2004, 11h42

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