Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1183 connectés 

  FORUM HardWare.fr
  Programmation
  Algo

  Action executé periodiquement dans une boucle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Action executé periodiquement dans une boucle

n°1975303
azubal
Posté le 19-03-2010 à 16:53:50  profilanswer
 

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 ?

mood
Publicité
Posté le 19-03-2010 à 16:53:50  profilanswer
 

n°1975310
flo850
moi je
Posté le 19-03-2010 à 16:58:06  profilanswer
 

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

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


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

n°1975311
azubal
Posté le 19-03-2010 à 17:00:10  profilanswer
 

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)

n°1975312
flo850
moi je
Posté le 19-03-2010 à 17:03:12  profilanswer
 

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


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

n°1975313
azubal
Posté le 19-03-2010 à 17:04:48  profilanswer
 

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

n°1975315
flo850
moi je
Posté le 19-03-2010 à 17:06:34  profilanswer
 

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

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

n°1975316
Profil sup​primé
Posté le 19-03-2010 à 17:08:17  answer
 

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 ?

n°1975319
azubal
Posté le 19-03-2010 à 17:14:43  profilanswer
 

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
n°1975322
Profil sup​primé
Posté le 19-03-2010 à 17:17:17  answer
 

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

n°1975326
azubal
Posté le 19-03-2010 à 17:19:17  profilanswer
 

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)

mood
Publicité
Posté le 19-03-2010 à 17:19:17  profilanswer
 

n°1975327
Kenelm
Posté le 19-03-2010 à 17:21:13  profilanswer
 

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).

n°1975328
Profil sup​primé
Posté le 19-03-2010 à 17:22:24  answer
 

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

n°1975329
Profil sup​primé
Posté le 19-03-2010 à 17:28:37  answer
 

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 :/

n°1975331
azubal
Posté le 19-03-2010 à 17:31:40  profilanswer
 

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
n°1975336
Profil sup​primé
Posté le 19-03-2010 à 17:37:47  answer
 

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

n°1975362
breizhbugs
Posté le 19-03-2010 à 18:54:43  profilanswer
 

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
n°1975370
azubal
Posté le 19-03-2010 à 19:51:35  profilanswer
 


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

n°1975375
Profil sup​primé
Posté le 19-03-2010 à 20:09:13  answer
 

[:powa] Bravo !

n°1975382
Trap D
Posté le 19-03-2010 à 20:29:19  profilanswer
 

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. }


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Algo

  Action executé periodiquement dans une boucle

 

Sujets relatifs
Condition non null pour rentrer dasn ma boucle[Résolu] referencer des instances creees par une fonction...
C - attendre n milliseconds entre 2 iterations d'une boucleLecture en boucle d'un FIFO avec un read [réglé]
boucle de music sur site webBlocage de débutant sur une boucle
afficher plusieurs éléments en une seule boucleRequete mysql qui s'execute avant l'execution de la page
Boucle, générateur de bouclesVBA Fin de la fonction je reviens dans ma boucle ???
Plus de sujets relatifs à : Action executé periodiquement dans une boucle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR