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 :

Incrémentation Plugin avec une Classe [Débutant]


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut Incrémentation Plugin avec une Classe
    Bonjour,
    J'ai créer un plugin qui fonctionne et me retourne une valeur.
    Cependant, j'ai ensuite créer une boucle infini afin de me retourner un chiffre qui augmente petit à petit mais le plugin ne me retourne que la première valeur.
    Pourriez-vous m'aidez ?
    Merci d'@vance.

    ps : je vous met le code du plugin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public int Compter()
            {
                int nombre = 1;
                for (int i = 2; i > 1; i++)
                {
                    nombre++;
     
                }
     
            }
    et l'appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private void button2_Click(object sender, EventArgs e)
            {
                ICollection<IPlugin> plugins = PluginLoader.LoadPlugins("Plugins");
                foreach (IPlugin item in plugins)
                {
                    if (item.Nom() == "Plugin2")
                    {
                        richTextBox1.Text = "plugin : " + item.Nom() + " nombre : " + item.Compter();
                    }
                }
            }

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Je ne vois pas de return dans ta méthode Compter(), une erreur de copier/coller ?
    Sinon si tu veux que ta méthode retourne à chaque fois une nouvelle valeur, tu peux soit regarder du côté de Yield Return, doit ajouter un membre dans la classe, l'incrémenter à chaque appel et renvoyer sa valeur.

    Edit: je viens de relire l'aide de Yield Return, ce n'est pas approprié ici.

    Tatayo.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    En vérité je faisait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public int Compter()
            {
                int nombre = 5;
                for (int i = 2; i > 1; i++)
                {
                    nombre++;
     
                }
          return nombre;
            }
    j'ai aussi essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      public int Compter()
            {
                int nombre = 5;
                for (int i = 2; i > 1; i++)
                {
                    nombre++;
                    return nombre;
                }
          return 2;
            }
    Mais comme dit précédément cela ne me renvoi que la première valeur, c'est pour cela que je me demandais si il n'y avait pas d'alternative au return.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    C'est tout à fait normal.
    Ton code fait exactement la même chose à chaque appel, donc il ne peut que renvoyer la même valeur.
    Pour que la méthode renvoie à chaque appel une nouvelle valeur, il faut "mémoriser" l'ancienne.
    Donc, à mon avis:
    1. Ajoute un membre privé de type int.
    2. Initialise le à 0 dans le constructeur
    3. Dans la méthode, incrémente simplement ce membre, et renvoie sa valeur


    Et voilà, c'est réglé.


    Tatayo.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Le probleme c'est que cette class est lié à une interface et je ne sais comment initialiser le constructeur. Je me retrouve donc avec une erreur System.MissingMethodException : ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Plugin2()
            {
                nombre = 0;
            }
     
              public int Compter()
            {
                    nombre++;
                    return nombre;
            }
    et mon interface :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    namespace PluginContract
    {
        public interface IPlugin
        {
            int Compter();
            String Nom();        
        }
    }

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Citation Envoyé par GFauconnier Voir le message
    Le problème c'est que cette class est lié à une interface et je ne sais comment initialiser le constructeur. Je me retrouve donc avec une erreur System.MissingMethodException : ma classe :
    Citation Envoyé par tatayo Voir le message
    1. Ajoute un membre privé de type int.
    2. Initialise le à 0 dans le constructeur
    3. Dans la méthode, incrémente simplement ce membre, et renvoie sa valeur
    J'ai dit dans le constructeur, pas au moment de l'instanciation… Il faut donc ajouter un constructeur à ta classe. Le fait que ta classe implémente une interface ne change rien ici.

    Tatayo.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    encore une fois desole mais il ne s'augmente encore que de 1 ....
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    using PluginContract;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
     
    namespace Plugin2
    {
        public class Plugin2 : IPlugin
        {
            private int nombre;
     
           public Plugin2 ()
            {
                nombre = 0;
            }
     
              public int Compter()
            {
                nombre++;
                return nombre;
            }
     
            public string Nom()
            {
                return "Plugin2";
            }
        }
    }

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    J'ai comme un doute en relisant le code de ton premier message.
    Est-ce que tu veux qu'une instance donnée renvoie un nombre qui s'incrémente à chaque appel, ou veux tu qu'à chaque instanciation le compteur augmente ?

    Dans la premier cas, la classe telle que tu l'as implémentée doit fonctionner. Chaque instance possède son propre compteur. Si tu mets l'appel de Compter() dans une boucle, tu auras à chaque itération une valeur différente.
    Dans le deuxième cas, il faut un membre commun à toutes les instances => un membre statique. Tu peux voir un exemple ici.

    Tatayo.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    J'ai envie que quand je clique sur le bouton alors mon nombre s’incrémente infiniment et que le résultat apparaisse mais je pense que quand j'appui sur le bouton il recharge tout le plugin a zéro. Cependant si j'appui une fois il devrai quand même me retourner des valeurs différentes puisque la variable nombre s’incrémente indéfiniment. Est-ce que cela ne serait pas le return qui fait fin de boucle , un peu comme un break ?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Le plus simple si tu veux comprendre ce qu'il se passe est de mettre un point d'arrêt dans le code, puis d'avancer pas à pas.
    Mais effectivement un return dans une boucle fait sortir de la boucle.
    Mais quoi qu'il en soit il y a un problème de logique dans ton code: à chaque appel de la méthode, tu relances la boucle. Donc ton compteur repart forcément de 5.
    Fais un test tout simple: dans le code de ton bouton, tu instancies la classe Plugin2 (telle qu'implémentée dans ton message de 13h48). Puis dans une boucle tu appelles la méthode compter, et tu affiches le résultat.
    La valeur va bien s'incrémenter à chaque appel. Pourquoi ? Car elle est "mémorisée" dans le membre Nombre.

    Maintenant regarde de nouveau le code de Compter() dans ton message de 13H80.
    Dans la première version: tu initialises nombre à 5, puis tu lances une boucle infinie. Comme tu ne sors jamais de la boucle, le code ne peut rien renvoyer.
    Dans la deuxième version: tu initialises nombre à 5, tu entres dans la boucle, tu incrémentes nombre de 1, et tu renvoies le résultat. Donc dans tous les cas, tu récupères… 6.

    Si à chaque appel de ton bouton tu crées une nouvelle instance de ta classe, mais tu veux quand même que le compteur s'incrémente, il te faut un membre statique.

    Tatayo.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Merci de ton aide je vais essaye avec un membre static.
    J'ai un autre problème cependant, à chaque modification je suis obligé de réactualiser le fichier ou se trouve mes .dll des plugin puisque la syncro et l’actualisation ne marche pas ...

  12. #12
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 896
    Points : 1 912
    Points
    1 912
    Par défaut
    Je pense qu'on devrait revenir aux basiques et commencer par expliciter le problème de départ. Pourquoi as-tu besoin de ce compteur ? Est-ce pour compter le nombre de plugins chargés ? Le nombre de fois où un plugin est chargé ? Le nombre d'objets instanciés dans un plugin ? Est-ce pour créer un un identifiant unique ? Autre chose encore ?

    Autre détail : tu as une une méthode Name() qui semble renvoyer le nom d'un plugin. Pour ce genre de chose .net propose les propriétés, qui correspondent de façon sous-jacente à un couple getter/setter, encapsulé dans un concept plus contextualisé et qui correspondraient mieux à ce que tu cherches à faire.

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Bonjour,
    Je cherche simplement à faire marcher un plugin en continue pour savoir si je peux le faire marcher en même temps qu'un autre sans qu'il s’arrête.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,

    Citation Envoyé par GFauconnier Voir le message
    Bonjour,
    Je cherche simplement à faire marcher un plugin en continue pour savoir si je peux le faire marcher en même temps qu'un autre sans qu'il s’arrête.
    Attention, je pense que tu fais une confusion. Un plugin n'est rien d'autre qu'une classe implémentant une interface. Tu peux donc appeler des méthodes d'une instance de cette classe mais en aucun cas le plugin "tourne" tout seul. Si tu appelles une méthode qui boucle tel que tu le présentes, la boucle sera exécutée dans le même thread que l'appelant et l'appelant ne reprendra la main qu'à la fin de la boucle comme pour n'importe quel autre méthode.

    Si tu veux que ton plugin "tourne en continue", il faudra que tu implémentes un système de thread. Bref, un plugin n'est pas "un moteur" sauf si tu l'implémentes

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 43
    Points : 33
    Points
    33
    Par défaut
    Ok merci de vos réponses

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

Discussions similaires

  1. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  2. Pb avec une Classe d'exception EOleError
    Par raoulmania dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/05/2005, 12h39
  3. Utilisation iterator avec une classe perso
    Par SteelBox dans le forum C++
    Réponses: 19
    Dernier message: 07/03/2005, 11h30
  4. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41
  5. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45

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