OVH Cloud OVH Cloud

Sortie de boucle

2 réponses
Avatar
herve.tourbez
Bonjour,

Pour un programme C d'acquisition de données cinétiques via un port COM
(spectro), j'ai besoin de pouvoir sortir de la boucle d'acquisition (temps
d'acquisition jugé suffisant par ex.) par appui sur la touche ESC par ex,
mais sans ralentir l'acquisition, cad s'il n' a pas appui sur la touche
ESC, on continue d'acquérir.

Cela exclue les fonctions standards qui demandent un appui sur ENTER en
supplément...

J'ai bien trouvé sur le web une fonction kbhit() qui fait appel à
getch() mais mon compilateur (CodeWarrior 6 pour Windows) me renvoie
systématiquement 2 erreurs à la compilation:

- kbhit() fonction sans prototype
- getch() fonction sans prototype

alors qu'avec les mêmes #includes (#conio.h, stdio.h, stdlib.h) , ca se
compile très bien avec DevC++.

Une idée?

2 réponses

Avatar
Vincent Burel
"Hervé TOURBEZ" wrote in message
news:
Bonjour,

Pour un programme C d'acquisition de données cinétiques via un port COM
(spectro), j'ai besoin de pouvoir sortir de la boucle d'acquisition (temps
d'acquisition jugé suffisant par ex.) par appui sur la touche ESC par ex,
mais sans ralentir l'acquisition, cad s'il n' a pas appui sur la touche
ESC, on continue d'acquérir.

Cela exclue les fonctions standards qui demandent un appui sur ENTER en
supplément...

J'ai bien trouvé sur le web une fonction kbhit() qui fait appel à
getch() mais mon compilateur (CodeWarrior 6 pour Windows) me renvoie
systématiquement 2 erreurs à la compilation:

- kbhit() fonction sans prototype
- getch() fonction sans prototype

alors qu'avec les mêmes #includes (#conio.h, stdio.h, stdlib.h) , ca se
compile très bien avec DevC++.

Une idée?



Ben, déjà vous avez intérêt à utiliser les fonctions windows CreateFile /
WriteFile / ReadFile (ainsi que les fonctions connexes : Set/GetCommState
Set/GetCommTimeouts).
Si c'est juste une acquisition, vous pouvez configurer les fonctions en mode
OVERLAP (mode événementielle).

Sinon, usuellement un flux de données est encapsulé dans une boucle (read /
write) tournant dans un thread différent que le thread primaire (thread
GUI). les données sont transférés via une pile de buffer (mode consommateur
/ producteur).

VB
Avatar
Bertrand Lenoir-Welter
Hervé TOURBEZ wrote:

J'ai bien trouvé sur le web une fonction kbhit() qui fait appel à
getch() mais mon compilateur (CodeWarrior 6 pour Windows) me renvoie
systématiquement 2 erreurs à la compilation:



Ca sent le bon vieux code pour DOS et on dirait que vous n'êtes pas
familier de la programmation événementielle sous Windows. Typiquement,
vous devez d'une part créer un thread qui va s'occuper de votre port
COM, ce qui vous libère des contingences de délai pour traiter le reste,
et d'autre part attraper un WM_KEYDOWN dans la pompe à messages de votre
application, en filtrant sur la touche VK_ESCAPE. Si vous utilisez un
compilo C++ avec encapsulation de l'API Windows, vous devez disposer
d'une possibilité de surcharge de fonction EvKeyDown().

L'idée centrale, c'est que votre boucle de lecture du port et la
surveillance du ESC sont dans des threads différents. Sinon, vous pouvez
aussi bricoler avec GetAsyncKeyState(VK_ESCAPE) dans la boucle de
lecture du port, mais ce sera moins joli.