Timer en C?

cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004 - 25 avril 2004 à 13:01
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004 - 25 avril 2004 à 19:45
J'aimerais lire sur le port parallèle pendant un temps limité (15 sec). Lorqu'une donnée est lue le timer s'arrete.
Apres 15 sec si aucune donnée n'a été lue une valeur par default est definie.

Merci d'avance pour votre aide!

13 réponses

cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
25 avril 2004 à 13:34
alors la premiere solution qui me vient a l'esprit: une boucle infinie ki lit le port //, ensuite dans ta boucle, tu met une variable a qui si = 1 continue la lecteur, pendant ce temps un timer est lancé au bout de 15 seconde il envoie la valeur 0 à a, ta boucle verifie la valeur de a et comme egale a 0, bah tu quitte la boucle infinie...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
25 avril 2004 à 15:28
Oui cela me semble la bonne solution, mais il faut pour cela que ta lecture ne soit pas bloquante... Une bonne solution pour faire un timer est d utiliser la fonction alarm(15), qui permet de declencher le signal SIGALRM au bout de 15 secondes, et tu enregistre un handler avec signal() avant.

Si tu veux de l aide sur ces fonctions c est pas bien complique, man signal ou man alarm sous Linux ou un autre Unix et sinon msdn je pense... De toute facon ces fonctions font partie du standard ANSI C...
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 18:20
Quelqu'un ne pourrait pas un peu m'éclairer sur le code?
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
25 avril 2004 à 18:40
tu definit une variable globale:

BOOL continue;


ton ton code tu tu dois avoir un truc comme ca (place le dans un thread c mieux !!!):

while(1) // boucle infinie
{
if(a)
{
/* lecture de port // */
}
}


ensuite tu créé un timer:

UINT SetTimer(
  HWND hWnd,              // handle of window for timer messages
  UINT nIDEvent,          // timer identifier
  UINT uElapse,           // time-out value
  TIMERPROC lpTimerFunc   // address of timer procedure
);


et dans ta procedure de Timer:
WM_TIMER:
a = FALSE;
break; 


voila j'ai fait ca vite fait, mais ton code doit avoir a peu pres cette tete...
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0

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

Posez votre question
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 18:48
Je comprends pas tout! Je ne programme pas sous Unix!

Quelle librairie dois-je employer? Qqlun aurrait il le courrage de me donner le code complet?

Merci d'avance!
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 18:49
J'utilise Borland C++ 3.1
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
25 avril 2004 à 18:58
Ce que LordBob a ecrit, c est du code C sous windows, et je nhe crois pas que cela necessite une librairie particuliere.

Sinon si tu veux le faire autrement :

#include <signal.h>

volatile int timeout = 0;

void alarm_handler(int nb)
{
  timeout = 1;
}

/* dans le code de ta fonction de lecture : */
signal(SIGALRM, alarm_handler);
alarm(15);

while(timeout=0)
{
  /* ta lecture non bloquante ... */
}
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 19:04
pour la fonction alarm()

J'ai besoin de quelle librairie?
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 19:12
#include <signal.h>

volatile int timeout = 0;

void alarm_handler(int nb) <== int nb doit valoir combien?
{
timeout = 1;
}

while(timeout=0)
{
lecture du port
signal(SIGALRM, alarm_handler);
alarm(15);
}

c'est bon comme ca?
0
cs_LordBob Messages postés 2865 Date d'inscription samedi 2 novembre 2002 Statut Membre Dernière intervention 11 mai 2009 9
25 avril 2004 à 19:14
oui mon code, c'est du code windows
Bob...

"La chance accorde ses faveur aux esprits avertis..."
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 19:28
#include <signal.h>

volatile int timeout = 0;

void alarm_handler(int nb) <== int nb doit valoir combien?
{
timeout = 1;
}

while(timeout=0)
{
lecture du port
signal(SIGALRM, alarm_handler);
alarm(15);
}

c'est bon comme ca?
0
MetalDwarf Messages postés 241 Date d'inscription mardi 29 octobre 2002 Statut Membre Dernière intervention 23 janvier 2006
25 avril 2004 à 19:34
Non ce n est pas tout a fait bon.

La valeur de nb n a pas d importance, c est pour differencier si tu mets le meme handler pour plusieurs signaux.
Ensuite il faut ecrire :

while(timeout == 0)
et non :
while(timeout = 0)

Ensuite il faut initialiser le handler avec signal() en dehors de la boucle, il suffit de le faire une fois.

Il faut aussi executer alarm(15) avant la boucle, sinon tu remet a chaque fois le compteur a 15!!

Voila sinon je ne pense pas qu il faille une librairie particuliere pour signal()...
0
cs_tof0256 Messages postés 8 Date d'inscription samedi 13 décembre 2003 Statut Membre Dernière intervention 25 avril 2004
25 avril 2004 à 19:45
Pourrais tu me corriger le code pour que j'arrive mieux a visualiser! Je suis un peu largué, je debute!

Avec alarm(15) ==> il me met qu'il lui faut un prototype ! Dans quelle librairie se trouve cette fonction?
0
Rejoignez-nous