Action executé periodiquement dans une boucle

Action executé periodiquement dans une boucle - Algo - Programmation

Marsh Posté le 19-03-2010 à 16:53:50    

Salut à tous, je bloque sur la meilleur facon de représenter la chose suivante :
 

Code :
  1. int ps = 0;
  2. int ds = 10;
  3. while (42)
  4. {
  5.     int s = getSecond();
  6.     if (s - ps > ds)
  7.     {
  8.         doActionEvery10Sec();
  9.         ps = ds;
  10.     }
  11.     sleep(1);
  12. }


 
getSeconds); retourne les secondes courantes dans la minute (donc boucle de 0 a 59);
 
Le probleme c'est quand s est inférieur a ps car on a changé de minute...
 
Y'a il une façon simple de régler ce probleme ?

Reply

Marsh Posté le 19-03-2010 à 16:53:50   

Reply

Marsh Posté le 19-03-2010 à 16:58:06    

Dans tous les langages, tu as un équivalent de sleep  

Code :
  1. while(42)
  2. {
  3.    doActionEvery10Sec();
  4.    sleep(10);
  5. }


---------------

Reply

Marsh Posté le 19-03-2010 à 17:00:10    

Pas con :D
 
Oui mais non, j'ai mis cet exemple simplifié mais en réalité, je fais d'autres choses à la place du sleep().
(C'est une boucle de multiplexage)

Reply

Marsh Posté le 19-03-2010 à 17:03:12    

alors garde juste le timestamp de ta derniere action (nombre de seconde depuis 1/1/1970)


---------------

Reply

Marsh Posté le 19-03-2010 à 17:04:48    

J'ai pas d'autres fonction de temps en dehors de ce getSecond();

Reply

Marsh Posté le 19-03-2010 à 17:06:34    

tu devrais peut etre préciser  ton langage :/
sinno, tu n'as pas de getminute ?

 


s - ps > ds || ( ps > ds && s +60 - ps  > ds )


Message édité par flo850 le 19-03-2010 à 17:08:22

---------------

Reply

Marsh Posté le 19-03-2010 à 17:08:17    

Citation :

Code :
  1. while (42)



 
Salut, c'est quoi cette condition ?
 
Si non, c'est quoi cet algo ?
 
A l'entrée dans la boucle, (si on entre) ps == 0 puis toujours 10.
Ce qui fait que tout les seconde, on vérifie que la seconde courante - 10 est supérieur à 10 pour faire le doaction.
C'est ça ?
Est-ce que mettre ps à 10, ds à 20 et faire s = getseceonde+10 non ?

Reply

Marsh Posté le 19-03-2010 à 17:14:43    

Pas de langage, j'aurai pu l'écrire en pseudo code. (while(42) == while(1) == while(true) == boucle ad vitam eternam).
Je n'ai qu'une seule fonction getSeconds qui me retourne la seconde courante dans la minute.
 

Code :
  1. crée "previousSecond" = 0
  2. crée "deltaSecond" = 10
  3. boucle à l'infini
  4. {
  5.     crée "currentSecond" = getSecond();
  6.     si (currentSecond - previousSecond inferieur à deltaSecond) // si ca fait plus de 10 secondes que je suis pas passé par là
  7.     {
  8.          fairequelquechose();
  9.          mettre à jours previousSecond à currentSecond;
  10.     }
  11.     Fairedautrestrucspasinteressant();
  12. }


Cet algo fonctionne tant que currentSecond est superieur à PreviousSecond,
Soit tant que currentSecond n'est pas revenu à 0;


Message édité par azubal le 19-03-2010 à 17:15:04
Reply

Marsh Posté le 19-03-2010 à 17:17:17    

Ben du incrémente une variable à chaque fois que tu repasse à zero et tu l'ajoute * 60

Reply

Marsh Posté le 19-03-2010 à 17:19:17    

C'est effectivement une solution. Mais je cherche à ne pas avoir de variable incrémentale infinie. Je dois faire tourner cette boucle pendant les 8 prochains siècles.... (c'est une image hein :D)

Reply

Marsh Posté le 19-03-2010 à 17:19:17   

Reply

Marsh Posté le 19-03-2010 à 17:21:13    

http://fr.wikipedia.org/wiki/La_gr [...] t_le_reste
 
Tout le monde n'est pas un bête programmeur a l'esprit limité, certains ont une vision plus harmonieuse des choses, et expriment leurs idées les plus folles dans leur code. while(42) est une façon plus poétique d'exprimer l'infini, autrement que par les vulgaire while(1) et while(true).
 
Les solutions de manquent pas : while(PerformanceFrequency!=0), while(eax!=eax), while(0xFFFF+1==0)...
 
Personnellement j'utilise while(true!=false).

Reply

Marsh Posté le 19-03-2010 à 17:22:24    

Ok, merci bien.  :jap:  
 
Moi j'utilise juste loop.

Reply

Marsh Posté le 19-03-2010 à 17:28:37    

azubal a écrit :

C'est effectivement une solution. Mais je cherche à ne pas avoir de variable incrémentale infinie. Je dois faire tourner cette boucle pendant les 8 prochains siècles.... (c'est une image hein :D)


 
N'essaye pas de tordre la cuillère, car la cuillère n'existe pas.
 
je vois pas d'autre solution. t'utilise une fonction qui te retourne une valeur bouclante, et toi tu veux un truc qui s'incrémente pendant huit siècle mais tu veux pas de variable qui te permette de le faire. C'est balot :/

Reply

Marsh Posté le 19-03-2010 à 17:31:40    

Hum,
et si je fais ca :

 
Code :
  1. crée "previousSecond" = 0
  2. crée "deltaSecond" = 10
  3. boucle à l'infini
  4. {
  5.    crée "currentSecond" = getSecond();
  6.  
  7.    si currentSecond inferieur à previousSecond
  8.    {
  9.        currentSecond = currentSecond + 60;
  10.    }
  11.    si (currentSecond - previousSecond inferieur à deltaSecond) // si ca fait plus de 10 secondes que je suis pas passé par là
  12.    {
  13.           fairequelquechose();
  14.           mettre à jours previousSecond à getSecond();
  15.      }
  16.      Fairedautrestrucspasinteressant();
  17. }
 

Ca à l'air pas mal ca nan ? :p


Message édité par azubal le 19-03-2010 à 17:34:33
Reply

Marsh Posté le 19-03-2010 à 17:37:47    

J'ai un doute de tête ! Mais je crois pas que ça le fasse non plus.
T'as testé ?

Reply

Marsh Posté le 19-03-2010 à 18:54:43    

et en utilisant le modulo?

Code :
  1. while (42)
  2. {
  3.      int s = getSecond();
  4.      if (s % 10 == 0)
  5.     {
  6.         doActionEvery10Sec();
  7.     }
  8.     sleep(1);
  9. }


après faut s'assurer qu'on rentre dans la boucle au moins une fois pas seconde...


Message édité par breizhbugs le 19-03-2010 à 18:55:20
Reply

Marsh Posté le 19-03-2010 à 19:51:35    


 
ouip, a priori ca marche.
sinon le coup su modulo pose probleme car je n'itere pas a chaque secondes.

Reply

Marsh Posté le 19-03-2010 à 20:09:13    

[:powa] Bravo !

Reply

Marsh Posté le 19-03-2010 à 20:29:19    

Et si on fait ça :
 

Code :
  1. crée "previousSecond" = 0
  2. crée "deltaSecond" = 10
  3.  
  4. boucle à l'infini
  5. {
  6.     crée "currentSecond" = getSecond();
  7.    
  8.    crée deltaSec = currentSecond - previousSecond;
  9.  
  10.    si (deltaSec < 0)
  11.    {
  12.        deltaSec = deltaSec + 60
  13.    } 
  14.    si (deltaSec supérieur  à deltaSecond) // si ca fait plus de 10 secondes que je suis pas passé par là
  15.    {
  16.              fairequelquechose();
  17.              mettre à jours previousSecond à getSecond();
  18.     }
  19.  
  20.      Fairedautrestrucspasinteressant();
  21. }

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed