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):
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 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 exécuté au bout du temps du Timer :
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(); }
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)
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()); }
J'espère avoir été clair.
Merci
Partager