Afficher un rappel selon une heure precise [Résolu]

Signaler
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009
-
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
-
Salut,
en fait j'explique la situation, j'ai une liste de rappels que je garde dans ma bdd Access, dans ce tableau j'ai aussi les heures auxquelles je dois afficher ces rappels.
Prenons l'exemple d'un rappel X qui dois s'afficher a 11h00, je voudrais donc quune petite fenetre apparaisse et contienne toutes les donnes concernant ce rappel.
Pour la petite fenetre ca nest pas un pb mais par contre je ne sais pas trop comment faire pour que mon programme reconnaisse lheure tout seul
jai bien pense a utiliser un timer afin de verifier toutes les minutes mais je trouve ca tres lourd.
Est-ce que vous auriez une solution plus propre a me proposer?

sandra

10 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Salut,

Une solution toute bête si tu n'as pas envie de vérifier toutes les X minutes, c'est de regarder dans ta table quelle est l'alerte la plus proche dans le temps.
Ensuite, tu prends la différence de temps entre la date actuelle du système et la date de ta prochaine alerte.
Et finalement, tu instancies un timer qui se déclenche apres que cette différence de temps soit passée.

Une fois le timer déclenché, tu affiches ton message, et tu modifies ton timer pour la prochaine alerte.

Mx
MVP C# 
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Hello,

Tu peux regarder dans ta base de données le prochain rappel à afficher, et mettre un timer qui se réveillera à ce moment.
Au moment du réveil du Timer, tu affiches l'événement en question, et tu va chercher le suivant.

Attention tout de même. Avec ce système, si tu rajoutes des rappels, il ne les verra que lorsque le timer arrive au bout, il se peut donc que tu doives aller tout de même vérifier si de nouveaux éléments ont été rajoutés. De plus, si les événements sont très éloignés (>24h), le timer peut ne pas bien gérer ces long délais.

Amicalement, SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Pas besoin de convertir :

Si tu soustrait deux DateTime, tu obtiens un TimeSpan, qui possède la propriété TotalMilliseconds

Ex pour afficher le nombre de millisecondes depuis minuit :

DateTime

Now = DateTime
.Now;
DateTime Noon = DateTime
.Today;
TimeSpan
dif = Now - Noon;
MessageBox.Show(dif.TotalMilliseconds.ToString());

Amicalement, SharpMao
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Salut,

Il te suffit de recuperer ta date, de la convertir en DateTime, et d'y soustraire la date actuelle (via DateTime.Now)
Ensuite, tu déclares une instance de la classe System.Threading.Timer

<hr />

DateTime dt;

DateTime.TryParse(
"taDate",
out dt); // Conversion de ta date

TimeSpan ts = dt.Subtract(
DateTime.Now); // Tu obtiens la différence
this.timer =
new System.Threading.
Timer(
new
TimerCallback(Elapsed));

this.timer.Change(ts, new
TimeSpan(-1)); // Tu initialises le Timer. new TimeSpan(-1) indique qu'un fois déclenché, l'evenement ne se repete pas

//...

private
void Elapsed(
object state)
{
   timer.Change(
Timeout.Infinite,
Timeout.Infinite); // desactivation du timer

   MessageBox.Show(
"alerte");
 // ici tu met ton code pour affecter un nouvel interval au timer (rappel de la méthode Change)
}

<hr />
Autrement, si tu tiens a obtenir un interval de temps en secondes (ou en millisecondes), regardes les propriétés de ton TimeSpan, tu y trouveras ton bonheur ;)

J'ai utilisé la classe System.Threading.Timer parce qu'il peut avoir de grosses valeurs en interval. Cependant, a toi de voir si ce n'est pas mieux pour toi d'utiliser la classe System.Timers.TimerMx
MVP C# 
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
Arf, eu par le refresh !

Amicalement, SharpMao
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
34
C'est vrai que c'est pas simple.. je sais pas trop.. peut être on peut se servir de l'API "Task Sheduler" de Windows mais je ne l'ai jamais utilisé.

Il existe un wrapper .NET sur CodeProject

http://www.codeproject.com/cs/library/taskschedulerlibrary.asp
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

pas mal merci de vos reponses cest tout bete mais je ny avais pas pense
Merci pour toutes vos reponses
Je suis sure d'y trouver mon bonheur,

sandra
Messages postés
92
Date d'inscription
mercredi 5 juillet 2006
Statut
Membre
Dernière intervention
5 août 2009

J'ai encore une petite et derniere question:

Comment est-ce que je fais pour obtenir un interval de temps en secondes.
Jai bien pense a convertir les 2 dates toOADate() et puis les soustraire, mais ensuite comment je fais pour obtenir des secondes?

Merci encore

sandra
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
Ne jamais partir faitre autre chose pendant qu'on tape une réponse, apres on se prend presque 30 minutes dans la vue  ^^

Mx
MVP C# 
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
62
C'est cu qui m'était arrivé lors de ma première réponse à ce post :-)

Amicalement, SharpMao