Timer en C?

Signaler
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004
-
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004
-
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

Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
11
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..."
Messages postés
241
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
23 janvier 2006

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...
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

Quelqu'un ne pourrait pas un peu m'éclairer sur le code?
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
11
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..."
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

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!
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

J'utilise Borland C++ 3.1
Messages postés
241
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
23 janvier 2006

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 ... */
}
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

pour la fonction alarm()

J'ai besoin de quelle librairie?
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

#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?
Messages postés
2865
Date d'inscription
samedi 2 novembre 2002
Statut
Membre
Dernière intervention
11 mai 2009
11
oui mon code, c'est du code windows
Bob...

"La chance accorde ses faveur aux esprits avertis..."
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

#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?
Messages postés
241
Date d'inscription
mardi 29 octobre 2002
Statut
Membre
Dernière intervention
23 janvier 2006

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()...
Messages postés
8
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
25 avril 2004

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?