Rolling Queue sur le framework ???

Résolu
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 26 avril 2007 à 11:47
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 - 27 avril 2007 à 16:08
Bonjour,

Je voulais savoir s'il existait une classe permettant la gestion d'une Queue ayant un buffer max. Je m'explique: je voudrais empiler des messages reçu dans un buffer. Cependant, je ne voudrais pas qu'il dépasse une certaine taille et qu'à partir de cette taille, il détruise automatiquement le message empilé le plux vieux.

Je pense que ce besoin est assez générique et il doit peut-être exister quelque chose sur le framework.

Merci,


Billou_13

Bask En Force


--------------------------------------------------------------------

Connaître la réponse est une chose, savoir pourquoi en est une autre

---------------------

5 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 avril 2007 à 13:49
ah et en framework 2 tu as les Queue<T> dans System.Collection.Generic...

Apres les méthodes enqueue et dequeue sont virtual
enfin cest surtout enqueue qui tinteresse, il te suffira dajouter une propriété genre MaxSize et dovveride enqueue pour faire un truc du genre

public virtual override Enqueue (T Item)
{
if (this.Length == this.MaxSize)
this.Dequeue();

base.Enqueue(T);
}
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 avril 2007 à 15:15
a moins que tu ne veuille empêcher un futur héritage, tu devrais laisser rollingqueue virtual
si jamais tu dois passer en framework 2 un jour, renomme capacity car cest une propriété qui existe dans la version generique de la classe
tes constructeurs prenant en paramètre une ICollection ne vérifient pas à la construction que la collection n'est pas supérieure a capacity (auquel cas tu devrais dequeue autant que nécessaire)

voila ;)
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
27 avril 2007 à 13:42
l'objet "Queue" est une fifo générique simple. en héritant de cet objet et en surchargeant les méthodes qui vont bien, tu dois pouvoir créer en 10 minutes montre en main la queue correpondant a ta demande je pense
0
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
27 avril 2007 à 14:28
Bonjour,

Merci pour ta réponse. J'ai effectivement fait comme tu me le préconisais. Pour ceux que cela intéresse, je poste le (peu) de code que j'ai implémenté pour se faire. Je suis désolé par avance car il s'agit de C++ managé sur le framework 1.1 . La migration vers le C# ne devrait pas vous être difficile. Ca va pas vous faire de mal de voir du C++ un peu ^^

RollingQueue.h :
        public __gc class RollingQueue : public Queue
            {
                public:
                    //Constructor
                    RollingQueue();
                    //Constructor
                    RollingQueue(ICollection* col);
                    //Constructor
                    RollingQueue(int capacity);
                    //Constructor
                    RollingQueue(ICollection* col, int capacity);

                    //Method to set maximum capacity of buffer
                    __property void set_Capacity(int value)        { _capacity = value; }
                    //Method to get maximum capacity of buffer
                    __property int get_Capacity()                { return _capacity; }

                    //Method to enqueue data
                    void Enqueue(Object* item);

                private:
                    int        _capacity;
            };

            //Default capacity for buffer
            const int DEFAULT_CAPACITY = 50;

RollingQueue.cpp :
            //Constructor
            RollingQueue::RollingQueue()
                : Queue()
            {
                _capacity = DEFAULT_CAPACITY;
            }
            //Constructor
            RollingQueue::RollingQueue(ICollection* col)
                : Queue(col)
            {
                _capacity = DEFAULT_CAPACITY;
            }
            //Constructor
            RollingQueue::RollingQueue(int capacity)
                : Queue()
            {
                _capacity = capacity;
            }
            //Constructor
            RollingQueue::RollingQueue(ICollection* col, int capacity)
                : Queue(col)
            {
                _capacity = capacity;
            }

            //Method to enqueue data
            void RollingQueue::Enqueue(Object* item)
            {
                if(_capacity > 0)
                {
                    //If buffer length is reached
                    while( Queue::Count >= _capacity ) Queue::Dequeue();
                }

                Queue::Enqueue(item);
            }


Billou_13

Bask En Force


--------------------------------------------------------------------

Connaître la réponse est une chose, savoir pourquoi en est une autre

---------------------
0

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

Posez votre question
billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
27 avril 2007 à 16:08
Je prends note, merci chef et bon week-end ^^


Billou_13

Bask En Force


--------------------------------------------------------------------

Connaître la réponse est une chose, savoir pourquoi en est une autre

---------------------
0
Rejoignez-nous