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 :

C# utilisation de la classe Timer en POO [Débutant]


Sujet :

C#

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut C# utilisation de la classe Timer en POO
    Bonjour,

    je me permets de venir poster sur ce forum, car j'essai d'apprendre la POO et j'ai un souci avec l'utilisation de la classe Timer.
    Je tiens à préciser que j'ai déjà pratiqué le C#, mais jamais de façon propre avec la POO.

    J'ai créé une classe Alarm que j'instancie en cliquant sur le bouton de mon formulaire...
    Lorsque je créer deux alarmes, elles se créées bien, affichent les messages et sonnent. Par contre, lorsque je clique sur le bouton permettant de supprimer une alarme, cela supprime la dernière alarme créée. Lorsque je clique une seconde fois, cela ne fait rien et une des deux alarmes continuent de sonner...
    J'ai beau essayer de comprendre, je n'arrive pas, pourtant j'ai cherché (lecture de livre sur la POO, suivi de tutos...).

    Voici mon code

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class Alarm
        {
            double tempsInterval;
            private static System.Timers.Timer MonAlarme; // Déclaration
     
            public Alarm(double interval)
            {
                tempsInterval = interval;
     
            }
     
            private void TempsEcoulee(object sender, ElapsedEventArgs e)
            {
                MessageBox.Show("temps du timer " + tempsInterval + " est écoulé !!" + e.SignalTime);   
            }
     
            public void Creer()
            {
     
                MonAlarme = new System.Timers.Timer(tempsInterval); //Instantiation
                MonAlarme.Elapsed += TempsEcoulee;
                MonAlarme.AutoReset = true;
     
            }
     
            public void Start()
            {
                MonAlarme.Start();
            }
     
            public void Stop()
            {
                MonAlarme.Stop();
                MonAlarme.Dispose();
            }
     
            public void Afficher()
            {
                throw new System.NotImplementedException();
            }
        }
    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
    31
    32
    33
    34
     public partial class Form1 : Form
        {
            Alarm PremiereAlarm;
            Alarm HAlarm;
            public Form1()
            {
                InitializeComponent();
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                PremiereAlarm = new Alarm(Convert.ToDouble(textBox1.Text));
                PremiereAlarm.Creer();
                PremiereAlarm.Start();
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                PremiereAlarm.Stop();
            }
     
            private void button3_Click(object sender, EventArgs e)
            {
                HAlarm = new Alarm(Convert.ToDouble(textBox1.Text));
                HAlarm.Creer();
                HAlarm.Start();   
            }
     
            private void button4_Click(object sender, EventArgs e)
            {
                HAlarm.Stop();
            }
        }
    Avez-vous une idée de ce qu'il peut se passer ?

    Je vous remercie d'avance.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Je constate que tu as deux méthode buttonX_Click, est-ce-que tu ne devrais pas avoir deux boutons d'arrêt, un pour chaque alarme ?

  3. #3
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Citation Envoyé par Soap51 Voir le message
    Avez-vous une idée de ce qu'il peut se passer ?
    Pourquoi ton timer (dans Alarm) est static?

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Pourquoi ton timer (dans Alarm) est static?
    Bien vu !

  5. #5
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour à tous et merci de votre aide

    Enfaite j'ai mis le timer en static car j'ai vu cela sur la Doc Microsoft : https://msdn.microsoft.com/fr-fr/lib...or=-2147217396

    Pour ce qui est des boutons, j'en bien deux boutons pour stopper les alarmes, le bouton "button2_Click" pour le premier timer et le "button4_Click" pour le second. C'est pour cela que je comprends pas pourquoi si j'appuie sur un ou l'autre des boutons, cela me stop toujours le dernier timer lancé.

    Je vous regarder du côté du static qui pourrait poser problème.

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Les éléments déclarés static existent au niveau de la classe et non au niveau de l'instance. Le champs MonAlarme est commun à toutes les instances de ta classe. Du coup tu crées deux instances de la classe Alarm, la méthode Creer() affecte un Timer à la même "variable", écrasant la référence à l'ancien objet. Il faut que tu supprimes ce static pour que chaque instance dispose de son propre Timer.

  7. #7
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut Super, mais... :)
    Bonjour à tous,
    Merci Noxen en enlevant le static cela a fonctionné !!! J'ai une dernière question avant de clôturer le sujet. Que se passe-t-il si je déclare un timer et que j'instancie deux fois celui-ci ? Aurais-je deux timer différents ou cela va écraser le premier objet ? J'essaie de comprendre le mécanisme de la POO.

    Merci

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

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 898
    Points : 1 915
    Points
    1 915
    Par défaut
    Tu peux aussi remercier l’œil acéré de ZenZiTone qui est le premier à avoir repéré le point bloquant. Si tu assignes deux fois une valeur à un champ, la première valeur sera effectivement perdue. Par contre le premier objet ne sera pas forcément supprimé, dans certains cas il peut rester des références inattendues. Par exemple tu ajoutes un handler (TempsEcoulee) à l'événement Elapsed, il est possible que ça conserve un lien vers le premier Timer qui empêchera le garbage collector de l'éliminer avant la suppression de l'objet Alarm qui le contient ; ça vaut le coup de désabonner explicitement le handler.

  9. #9
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2018
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Bonjour et merci pour ces explications, je commence à comprendre le mécanisme de la POO en C#.

    Effectivement Noxen je tiens à vous remercier tous pour vos aides et explications.

    Merci à toi ZenZitone d'avoir trouvé l'origine de mon problème, tu m'as aidé dans mon apprentissage du C# en POO.

    Je clos le sujet.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/02/2007, 18h02
  2. [POO] utilisation de la classe COM
    Par Juanito-Toto dans le forum Langage
    Réponses: 4
    Dernier message: 14/11/2006, 15h17
  3. Problème d'utilisation de la classe timer
    Par benjiprog dans le forum Langage
    Réponses: 4
    Dernier message: 04/09/2006, 13h41
  4. Réponses: 4
    Dernier message: 25/07/2006, 16h30
  5. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34

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