Appel périodique d'une fonction??

Appel périodique d'une fonction?? - C++ - Programmation

Marsh Posté le 10-05-2008 à 19:38:38    

Salut à tous :hello:  
Je veux faire un appel périodique pour une fonction pendant toute l'éxécution du programme  
(5 fois par seconde), si quelqu'un peut m'aider je serais réconnaissante.

Reply

Marsh Posté le 10-05-2008 à 19:38:38   

Reply

Marsh Posté le 10-05-2008 à 19:49:43    

En utilisant un timer.

Reply

Marsh Posté le 10-05-2008 à 23:06:12    

+1
 
Pas possible en C++ standard et pur, sauf si ton programme ne fait rien d'autre que d'appeler la fonction :
 

Code :
  1. for ( ; ; )
  2. {
  3.    time_t previous = time( NULL );
  4.    while( difftime( time( NULL ), previous ) < 5 );
  5.    f();
  6. }


 
 
Dans une boucle (ici infinie), ça appelle f() toutes les 5s, en bouffant 100% de ton CPU, tout le temps. Donc méthode portable mais complètement crade.

Reply

Marsh Posté le 11-05-2008 à 10:49:16    

boost::asio a des versions portables de tout le patakesse nécessaire, avec en outre , des méthodes d'attentes asynchrones.

Reply

Marsh Posté le 30-12-2008 à 13:31:54    

Je suis d'accord avec ccp6128 !
Plus précisément, il faut que tu lances un thread au début de ton main afin d'exécuter en parallèle un processus qui ne sert qu'à appeler ta fonction périodiquement. Pour cela, il faut utiliser un TIMER, et non la solution proposée par jesus_Christ, car avec son code, ton ordinateur va complètement freezer (il fera le calcul en boucle du difftime, autant dire que de mettre une telle condition dans un while, c'est quasiment créer une boucle infinie !).

Reply

Marsh Posté le 30-12-2008 à 13:46:50    

Il faudrait connaitre l'environnement.
 
Par exemple, si c'est sous Windows, les timers existent et sont faciles d'utilisation.

Reply

Marsh Posté le 30-12-2008 à 13:52:04    

tout à fait,si tu n'as pas de contrainte de portabilité, utilise setTimer de windows


Message édité par frenchtoucco le 30-12-2008 à 13:56:53

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 30-12-2008 à 21:42:01    

et ma réponse elle est transparente ...

Reply

Marsh Posté le 30-12-2008 à 21:53:48    

Joel F a écrit :

et ma réponse elle est transparente ...


la portabilité ça intéresse uniquement les personnes compétentes  :o


Message édité par sligor le 30-12-2008 à 21:54:00
Reply

Marsh Posté le 31-12-2008 à 01:41:26    

je serais curieux de savoir le nombre d'applications qui ont tournées en définitif durant leur "durée de vie" sur, ne serait ce que deux plateformes différentes...en d'autre terme la portabilité c'est bien, mais quand ça à un intérêt

Message cité 3 fois
Message édité par frenchtoucco le 31-12-2008 à 01:43:30

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 31-12-2008 à 01:41:26   

Reply

Marsh Posté le 31-12-2008 à 03:22:17    

et ça représente plus de 50% des applis selon toi ? sans connaitre le chiffre mais juste intuitivement je dirais un largement +50% des applis tourne en mono platerforme


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 31-12-2008 à 09:46:44    

frenchtoucco a écrit :

je serais curieux de savoir le nombre d'applications qui ont tournées en définitif durant leur "durée de vie" sur, ne serait ce que deux plateformes différentes...en d'autre terme la portabilité c'est bien, mais quand ça à un intérêt


 
ASIO ets surtout interessant pour son API et son rationale. Le multipalteforme n'ets que la cerise sur le gateau.
Et pour info, vendredi c'ets vendredi :o

Reply

Marsh Posté le 31-12-2008 à 14:57:26    

Joel F a écrit :


Et pour info, vendredi c'ets vendredi :o


 
lol


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 03-01-2009 à 11:51:24    

frenchtoucco a écrit :

je serais curieux de savoir le nombre d'applications qui ont tournées en définitif durant leur "durée de vie" sur, ne serait ce que deux plateformes différentes...en d'autre terme la portabilité c'est bien, mais quand ça à un intérêt


 
Je travaille depuis 6 ans sur une application que j'ai créé (on est 3 développeurs dessus maintenant), qui est portable sous windows (XP) / windowsCE / linux , et sur x86 et xscale PXA270 (avec de l'assembleur pour les 2 plateformes), et à chaque fois que j'ai a réécrire un module, je fais toujours attention que la portabilité soit conservée (quand c'est possible).
 
On voit souvent sur ce forum citer boost. J'aurais bien aimé l'intégrer mais à cause de winCE (sur laquelle elle n'est pas dispo, du moins à la date ou j'avais l'occasion de pouvoir changer), je n'ai pas pu l'intégrer :(
 
Intérêt : dans le domaine de l'embarqué (aéronautique dans mon cas), wince et linux sont 2 plateformes que l'on peut rencontrer. Parfois, le matériel est livré soit avec l'une, soit l'autre mais rarement les 2. Avec un programme portable, le déploiement se fait très rapidement en cas de changement de hard (et plateforme).
 
 
Pour répondre à la question posée, tu as au moins 2 solutions pour faire cela :  
  - Créer un thread. Tu peux utiliser la libpthread qui existe sous windows et sous linux.
  - Créer un timer. Sous windows, c'est assez simple à mettre en place (voir API win32), sous linux pas de timer équivalent, mais tu peux regarder du coté des signaux avec le signal SIGALARM.
 
Attention, je vois que tu dois exécuter ta fonction 5 fois par seconde, soit 200ms. Est ce que la précision a une importance ? car les timers ont une résolution peu précise (55 ms sous windows, donc tes 200ms feront 220ms +- un delta). Si oui, regarder du coté des timers haute résolution.
 
Bien entendu, comme ça a été cité plus haut, il y a la bibliothèque boost qui t'offre pas mal de fonctionnalités pourvu que tu puisses l'utiliser.

Message cité 1 fois
Message édité par xilebo le 03-01-2009 à 12:05:30
Reply

Marsh Posté le 03-01-2009 à 14:40:35    

xilebo a écrit :


 
Je travaille depuis 6 ans sur une application que j'ai créé (on est 3 développeurs dessus maintenant), qui est portable sous windows (XP) / windowsCE / linux , et sur x86 et xscale PXA270 (avec de l'assembleur pour les 2 plateformes), et à chaque fois que j'ai a réécrire un module, je fais toujours attention que la portabilité soit conservée (quand c'est possible).
 
On voit souvent sur ce forum citer boost. J'aurais bien aimé l'intégrer mais à cause de winCE (sur laquelle elle n'est pas dispo, du moins à la date ou j'avais l'occasion de pouvoir changer), je n'ai pas pu l'intégrer :(
 
Intérêt : dans le domaine de l'embarqué (aéronautique dans mon cas), wince et linux sont 2 plateformes que l'on peut rencontrer. Parfois, le matériel est livré soit avec l'une, soit l'autre mais rarement les 2. Avec un programme portable, le déploiement se fait très rapidement en cas de changement de hard (et plateforme).
 
 
Pour répondre à la question posée, tu as au moins 2 solutions pour faire cela :  
  - Créer un thread. Tu peux utiliser la libpthread qui existe sous windows et sous linux.
  - Créer un timer. Sous windows, c'est assez simple à mettre en place (voir API win32), sous linux pas de timer équivalent, mais tu peux regarder du coté des signaux avec le signal SIGALARM.
 
Attention, je vois que tu dois exécuter ta fonction 5 fois par seconde, soit 200ms. Est ce que la précision a une importance ? car les timers ont une résolution peu précise (55 ms sous windows, donc tes 200ms feront 220ms +- un delta). Si oui, regarder du coté des timers haute résolution.
 
Bien entendu, comme ça a été cité plus haut, il y a la bibliothèque boost qui t'offre pas mal de fonctionnalités pourvu que tu puisses l'utiliser.


 
oui typiquement ici ça a un intérêt biensûr!


Message édité par frenchtoucco le 03-01-2009 à 14:41:12

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Sujets relatifs:

Leave a Replay

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