Afficher un rappel selon une heure precise

Résolu
sandra26 Messages postés 92 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 5 août 2009 - 12 oct. 2006 à 15:37
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 - 13 oct. 2006 à 10:54
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

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
12 oct. 2006 à 15:52
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# 
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
12 oct. 2006 à 16:00
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
3
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
13 oct. 2006 à 08:16
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
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2006 à 08:40
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# 
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
12 oct. 2006 à 16:01
Arf, eu par le refresh !

Amicalement, SharpMao
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
12 oct. 2006 à 16:04
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
0
sandra26 Messages postés 92 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 5 août 2009
12 oct. 2006 à 20:06
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
0
sandra26 Messages postés 92 Date d'inscription mercredi 5 juillet 2006 Statut Membre Dernière intervention 5 août 2009
13 oct. 2006 à 00:23
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
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2006 à 08:42
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# 
0
SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
13 oct. 2006 à 10:54
C'est cu qui m'était arrivé lors de ma première réponse à ce post :-)

Amicalement, SharpMao
0
Rejoignez-nous