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

Windows Forms Discussion :

Evènements sur plusieurs Timers


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Evènements sur plusieurs Timers
    Bonjour j'ai un petit problème, et je n'arrive vraiment pas à voir de solution (doit bien y en avoir une).

    Mon programme ressemble à une todo list.
    J'enregistre des tâches, l'heure à laquelle l'utilisateur veut qu'elles apparaissent et la fréquence d'apparition.
    Donc dès le lancement du logiciel je lance un thread qui vérifie si une tâche doit être lancée (en comparant l'heure actuelle avec l'heure de la tâche).
    Si une tâche doit être effectuée une messagebox apparaît, puis je lance un Timer en fonction de la fréquence d'apparition de la tâche. Au bout du temps j'affiche toujours une messagebox.

    Pour afficher les messagesbox à la fin du Timer je garde une trace de la dernière tâche qui a été affichée.
    Tout ça marche très bien avec une seule tâche, mais avec plusieurs tâches forcément ça affiche plusieurs fois la même tâche (la dernière).
    J'arrive pas à voir comment faire pour afficher la bonne tâche sachant que le timer peut durer plus ou moins longtemps selon la tâche...

    J'ai 4 ArrayList en attributs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ArrayList tache; // stocke les tâches
    ArrayList heure; // stocke l'heure à laquelle afficher la tâche
    ArrayList minutes; // stocke la minute à laquelle afficher la tâche
    ArrayList frequence; // stocke la fréquence d'affichage de la tâche

    Voici mon code

    Méthode lancé dès le début (dans un thread):
    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
    void LancerTimers()
    {
    	int h,m,s;
            String secondes;
    	while(true)
    	{
    		this.date = DateTime.Now;
    		h = this.date.Hour;
    		m = this.date.Minute;
    		s = this.date.Second;
    		secondes = "0";
     
    		for(int i=0;i < this.heure.Count; i++)
    		{
    			 if((h.ToString() == this->heure[i]->ToString()) && (m.ToString() == this->minutes[i]->ToString()) && (s.ToString() == secondes))
    			{
    				 this.index = i;
    		                 MessageBox.Show(this.tache[i].ToString());
    				 this.VerifierFrequence();
    			}
    		}
    	        Thread.Sleep(50);
    	}
    }
    Méthode qui lance les timers :
    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
     
    void VerifierFrequence()
    {
    	this.timer.Elapsed += new ElapsedEventHandler(AfficherBulle);
     
    	if(this.frequence[index].ToString() == "Toutes les semaines")
            {
    		this.timer.Interval = 604800000;
    	 }
    	else if(this.frequence[index].ToString() == "Tous les jours" )
    	{
    		this.timer.Interval = 86400000;
    	}
            else if(this.frequence[index].ToString() == "Toutes les heures" )
    	 {
    		 this.timer.Interval = 3600000;
    	 }
    	 else if(this.frequence[index].ToString() == "Toutes les 30 minutes" )
    	 {
    			this.timer.Interval = 1800000;
    	}
            else if(this.frequence[index].ToString() == "Toutes les minutes" )
    	{
    		 this.timer.Interval = 60000;
    	 }
     
    	this.timer.Start();
    }
    Méthode exécuté au bout du temps du Timer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void AfficherBulle(object source, ElapsedEventArgs e)
    {				 
            MessageBox.Show(this.tache[this.index].ToString());
    }
    Donc comme l'attribut index est l'indice de la dernière tâche affichée, au bout du Timer j'affiche toujours cette tâche, alors que je veux afficher une autre tâche (je pourrais stocker tous les indices des tâches déjà affichées dans un tableau mais je vois toujours pas comment savoir quelle tâche à afficher vu que le Timer peut être différent pour chacune)

    J'espère avoir été clair.
    Merci

  2. #2
    Membre émérite
    Avatar de laedit
    Homme Profil pro
    Consultant études et développement
    Inscrit en
    Décembre 2006
    Messages
    1 344
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consultant études et développement
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 344
    Points : 2 265
    Points
    2 265
    Par défaut
    Un conseil, remplace toutes les ArrayList par des List typées.

    ça sera beaucoup plus facile et tu n'auras pas de cast à faire.

    Ensuite, je pense qu'avec une liste de tâches courante (à afficher) avec le temps d'attente entre deux affichages devrait faire l'affaire.

    Le mieux serait sûrement de gérer ça en interne dans la tâche, elle aurait une méthode par exemple LauchTimer qui lancerait le timer. Et le tick du timer serait donc dans la classe de la tâche et elle afficherait la tâche elle-même.
    Blog - Articles - Framework

    MSDN vous aide, si si, alors n'hésitez pas à y faire un tour avant de poser une question.
    Ah, et n'oubliez pas, Google peut répondre à la majorité de vos questions.

  3. #3
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Personellement, je traite ce type d'appli en lançant un timer unique (avec par exemple, un délai de 1 seconde,1 minute ou 1 heure suivant l'appli) qui explore toute la ToDo list pour vérifier si il y a quelque chose à faire à cet instant. Si oui, lancement d'une procédure ou création d'un thread pour chaque tâche à effectuer.
    Et ... toujours réarmer le timer tant que la ToDoList n'est pas vide.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    J'ai géré ça en interne avec une nouvelle classe et ça fonctionne.
    Merci à vous 2.

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

Discussions similaires

  1. [AC-2010] Evènement sur plusieurs contrôles en même temps
    Par illight dans le forum IHM
    Réponses: 4
    Dernier message: 25/09/2014, 12h13
  2. [Toutes versions] Evènement sur plusieurs contrôles
    Par Fabious dans le forum IHM
    Réponses: 5
    Dernier message: 06/10/2011, 15h41
  3. Réponses: 12
    Dernier message: 09/09/2008, 14h48
  4. [CR] Groupement dynamique sur plusieurs champs paramètrés
    Par CDRIK dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 07/06/2004, 17h55
  5. Evènement sur clic droit !?
    Par soccersoft dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/12/2002, 21h39

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