Modifier un champs d'une classe depuis un événement levé par un timer?

totoetsasoeur Messages postés 2 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 7 octobre 2009 - 7 oct. 2009 à 17:22
totoetsasoeur Messages postés 2 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 7 octobre 2009 - 7 oct. 2009 à 19:10
Bonjour,

Afin de pouvoir exposer le mieux possible mon problème, j'ai fait une petite classe qui s'appelle "lampe".

Le but visé est de pouvoir éteindre une lampe automatiquement à l'aide d'un timer (après un certain temps, pas précis, depuis la création de la lampe).

En bref, lorsque l'on créé une lampe, elle est ON. Un timer lui est associé. Dès que le temps est écoulé, le timer lève un event. Et c'est à ce moment là que j'aimerais changer l'état de la lampe en le mettant à OFF.

Voici comment je m'y suis pris:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;


namespace event_dans_class2
{
    class lamp
    {
        /*les constantes.*/
        private const bool LAMP_IS_OFF = false;
        private const bool LAMP_IS_ON = true;

        /*les membres statiques.*/
        private static uint count = 0; //compteur général
        private static Timer timer; // timer pour éteindre automatiquement la lampe.

        /*les champs.*/
        private uint id;
        private string name;
        private bool state;

        /*le constructeur.*/
        public lamp()
        {
            count++;
            this.id = count;
            this.name = "lampe_" + count.ToString();
            this.state = LAMP_IS_ON;
            initTimer();
        }

        /*les propriétés.*/
        public uint Id
        {
            get { return this.id; }
            set { this.id = value; }
        }
        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }
        public bool State
        {
            get { return this.state; }
            set { this.state = value; }
        }

        /*Les méthodes publiques.*/
        public void Display()
        {
            Console.WriteLine("Lampe (id={0}, name={1}, state={2})",
                                this.id,
                                this.name,
                                this.state);
        }

        /*Les méthodes privées.*/
        /* Initialisation du timer.*/
        private static void initTimer()
        {
            /*On veut un interval de 6s*/
            timer = new Timer(6000);
            /*Méthode à éxécuter lorsque l'événement est levé.*/
            timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            /*L'événement est levé seulement la première fois*/
            timer.AutoReset = false;
            timer.Enabled = true;
            Console.WriteLine("Initialisation du timer.");
        }

        /*Spécifions ce que l'on veut qui soit fait à chaque débordement du timer:
         on veut éteindre la lampe.*/
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            /*Pour s'assurer que cette méthode est appelée qu'une seule fois.*/
            timer.Enabled = false;

            Console.WriteLine("Timer est OFF {0}", e.SignalTime);

            /*J'aimerais éteindre la lampe ici.*/
            state = lamp.LAMP_IS_OFF; // <== problème car le champs state n'est pas statique
        }

    }
}



Bizzare, le Ctrl+V à viré toutes les majuscules...

Bref, comment puis-je modifier le champ "state" (qui n'est pas static) depuis la méthode "OnTimedEvent" (qui est static)??

Merci de votre aide.
Stéphane
A voir également:

2 réponses

DrIvory Messages postés 47 Date d'inscription lundi 14 septembre 2009 Statut Membre Dernière intervention 6 novembre 2009 3
7 oct. 2009 à 17:38
Pourquoi mettre ontimedevent en static ainsi que inittimer ?

En virant les mots clés static ca fonction très bien ^^
0
totoetsasoeur Messages postés 2 Date d'inscription vendredi 6 février 2009 Statut Membre Dernière intervention 7 octobre 2009
7 oct. 2009 à 19:10
Merci, en fait pour répondre à la question, je dirais que:

1) je suis débutant.
2) je me suis inspiré de la documentation msdn au sujet du fonctionnement du timer.
3) je pensais qu'il était nécessaire de mettre les deux fonctions en static, car elles sont plus proches de l'aspect "type" de la classe plutôt que de son aspect "membre".

Pourriez-vous me confirmer que ma réflexion au point 3) n'est pas trop fausse?

En tous les cas encore merci pour votre rapide réponse.
Stéphane
0
Rejoignez-nous