10
votes

Comment obtenir des informations de clavier tout en faisant d'autres choses en même temps?

J'utilise C (GCC) et NCurses, pour créer un programme qui surveillera les données provenant du port série. Le programme a un gros pendant , où il lit les données provenant du port et en même temps, elle imprime cette information à l'écran ...

Mais le problème est ici:

Comment peut-il lire l'entrée de mon clavier, (puisque getch () gèle le programme jusqu'à ce qu'il obtient une entrée) et en même temps les informations de lecture du port?

Peut-être que je dois utiliser un autre moyen (pas le gros pendant ), de sorte que les idées sont les bienvenues!


2 commentaires

5 Réponses :


8
votes

faire getch strud> un appel non bloquant à l'aide d'une option forte> NODELay forte>.

nodelay(stdscr,TRUE);


3 commentaires

Exactement ce que je cherchais! Merci!!


Ce lien ne mentionne pas réellement nodelay ()


Ce n'est pas lié à la réponse, d'où c'est ajouté comme un commentaire.



0
votes

Selon votre environnement, vous avez peut-être la fonction kbhit (), il ne fait que pics dans la mémoire tampon du clavier et retourne non nulle s'il y a une clé là-bas - alors vous pouvez faire getch ().

(conio.h)


0 commentaires

0
votes

Peut-être fourchette ()? Gardez simplement à l'esprit que l'enfant fonctionne dans un processus séparé afin que les variables ne puissent pas être directement partagées entre eux

pid_t pID = fork();
if (pID == 0) {                // child
   // Code  executed only by child process
   // getch() ...
} else if (pID < 0) {          // failed to fork
   // Throw exception
   // ... 
} else {                       // parent
   // Code executed only by parent process
   // ...
}


2 commentaires

Ouais, je sais que cela peut causer des maux de tête - cavalier vide.


C'est un moyen élégant ... je ne le savais pas. Mais lorsque vous travaillez avec des ncurses, je pense que l'option Nodelay est plus simple.



0
votes

Essayez SELECT () ou sondage () . Ils font tous les deux la même chose, mais avec différentes interfaces. Vous lui donnez une liste des descripteurs de fichiers et il faudra attendre que au moins un de ces descripteurs soit prêt, puis revenez et vous indique lesquels peuvent être lus (ou écrites) sans blocage. Consultez les liens pour des exemples et plus de détails.


0 commentaires

-1
votes

Utiliser cbrefbre () pour désactiver la mémoire tampon de ligne xxx

Ceci vous obtiendra un getch () sans blocage () fonction.


1 commentaires

Cela bloquera toujours jusqu'à ce qu'une touche soit enfoncée.