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 :

Question sur le déclenchement d'un événement


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Par défaut Question sur le déclenchement d'un événement
    Bonjour à tous,
    Je viens vers vous car j'ai besoin d'explications sur la réaction du déclenchement d'événement.

    Voilà :
    J'ai créé une classe où j'utilise le code de l'exemple de MSDN pour générer un événement. http://msdn.microsoft.com/fr-fr/libr.../wkzf914z.aspx
    Pourquoi, lorsque j'instancie l'événement et fait un start, je reste dans la boucle du "while" qui a pour effet de ne plus me laisser la main sur ma forme (plus d'évolution de mon soft, plus d'affichage, la boucle n'est pas en tache de fond) ?


    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    public class AlarmEventArgs : EventArgs
    {
       private DateTime alarmTime;
       private bool snoozeOn = true;
     
       public AlarmEventArgs(DateTime time)
       {
          this.alarmTime = time;
       }
     
       public DateTime Time
       {
          get { return this.alarmTime; }
       }
     
       public bool Snooze
       {
          get { return this.snoozeOn; }
          set { this.snoozeOn = value; }
       }   
    }
     
    public class Alarm
    {
       private DateTime alarmTime;
       private int interval = 10;
     
       public event AlarmEventHandler AlarmEvent;
     
       public Alarm(DateTime time) : this(time, 10)
       {
       }
     
       public Alarm(DateTime time, int interval)
       {
          this.alarmTime = time;
          this.interval = interval;
       }
     
       public void Set()
       {
          while (true) {
             System.Threading.Thread.Sleep(2000);
             DateTime currentTime = DateTime.Now;
             // Test whether it is time for the alarm to go off.
             if (currentTime.Hour == alarmTime.Hour && 
                 currentTime.Minute == alarmTime.Minute)
             {    
                AlarmEventArgs args = new AlarmEventArgs(currentTime);
                OnAlarmEvent(args);
                if (! args.Snooze) 
                   return;
                else
                   this.alarmTime = this.alarmTime.AddMinutes(this.interval);
             }
          }
       } 
     
       protected void OnAlarmEvent(AlarmEventArgs e)
       {
          AlarmEvent(this, e);
       }  
    }

    Pour résoudre ce problème, j'ai créé et lancé un "thread" sur set(). L'ensemble reste fonctionnel avec les mêmes réactions.
    Cela perd de son sens !?

    J'ai cependant dû passer à coté de quelque chose?
    En vous remerciant pour votre aide.
    Cordialement.

  2. #2
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Le plus simple, pour ce que tu veux faire, est peut-être la classe timer : http://msdn.microsoft.com/en-us/libr...v=vs.110).aspx

  3. #3
    Membre expérimenté
    Homme Profil pro
    Chef de Projet
    Inscrit en
    Décembre 2012
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Chef de Projet
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2012
    Messages : 113
    Par défaut
    Bonsoir,

    Tu restes dans la boucle car tu ne la quittes pas !

    Le seul moment où tu peux quitter la boucle, c'est si la variable args (que tu instancies dans ta boucle), à sa propriété Snooze à false.

    Ensuite, Sleep met en pause le thread courant, et non pas juste la méthode appelée. Il est donc normal que la boucle de traitement des événements ne fonctionne plus si tu n'as pas pris de précautions et que cela gèle ta form.

    Comme indiqué par GuruuMeditation, il faut que tu ailles voir du côté des timers. Cela te facilitera grandement la tâche. En gros, tu définis un timer avec une période de 2000. Ensuite, tu définis une méthode qui contient le code contenu dans ta boucle while, le sleep en moins.

    Le timer exécutera alors automatiquement ton code toutes les 2 secondes.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Par défaut
    Bonjour GuruMediation, ElTotor,

    Merci pour vos idées et solutions, j'ai juste encore une question où j'ai du mal à départager la meilleure solution.

    Est-ce qu'un thread avec une boucle est équivalent à un timer comme ci-dessous ? :

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                monThread = new Thread(MaMethodeThread);
                monThread.Start();
                MaMethodeThread {while(true){ sleep(2000); Faire ..}}
     
       // On configure le timer
       timer.Interval = 2000;
       // On s'abonne au traitement désiré
       timer.Tick += new EventHandler(MaMethode);
       // On le démarre
       timer.Start();
    MaMethode(){ faire ..}

    ( Un processus n'a pas ce problème un événement timer non plus d'où ma première question ?? )

    Merci pour votre aide.

    Cordialement

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2008
    Messages : 612
    Par défaut
    Salut
    -----

    Ton thread fonctionnera également, mais les abonnés à ton évènement "Alarm" vont très vite rencontrer un problème, vu que l'appel à "OnAlarmEvent" se fait de façon synchrone au thread secondaire, et donc non synchrone au thread principal qui détient les contrôles. Bref, les abonnés ne pourront rien afficher à partir de l'évènement, sauf à rendre les appels synchrones (Invoke, beginInvoke)

    L'alternative étant d'appeler OnAlarlEvent de façon synchrone au thread principal, pour reporter le problème en amont.

    Bref, tu vas lancer un thread secondaire dont pratiquement la seule fonction va être de devoir lancer des appels synchrones au thread principal. C'est un peu à contre-emploi de l'intérêt de lancer un thread secondaire.

    Les deux solutions fonctionneront, mais je suis du même avis que GuruuMeditation (un nom qui rappelle l'Amiga) et ElTotor: l'utilisation d'un timer est beaucoup plus simple, et, vu le contexte, plus efficace.

    A+
    Claude

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2011
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Février 2011
    Messages : 72
    Par défaut
    Merci à tous !!

Discussions similaires

  1. Question sur les évènements
    Par Finality dans le forum C#
    Réponses: 3
    Dernier message: 23/12/2008, 23h37
  2. Question sur la performance des événements
    Par stephane.julien dans le forum C#
    Réponses: 8
    Dernier message: 11/04/2008, 10h58
  3. question sur évènement OnKeyPressed
    Par steph_1 dans le forum Langage
    Réponses: 3
    Dernier message: 14/09/2007, 15h29
  4. Question sur l'événement onLoad
    Par schnito dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 13/04/2007, 17h33
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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