il existe un moyen d'exécuter un cycle infini qui s'arrête uniquement sur l'entrée utilisateur du clavier sans demander à chaque cycle de continuer? dans un programme C (Je développe un chat C qui lit les entrées avec une boucle for(;;)
et je dois l'arrêter seulement quand l'utilisateur veut taper et envoyer un message) salut à tous!faire tandis que l'arrêt de la boucle infinie sur l'entrée du clavier - C
Répondre
Vous n'avez pas spécifié le système d'exploitation, donc je supposerai un système d'exploitation compatible POSIX. Vous pouvez utiliser select. Cela peut être utilisé pour bloquer un ensemble de descripteurs de fichiers (dans votre cas, stdin) avec un délai d'expiration fini ou un blocage indéfini.
Je suppose que, puisqu'il s'agit d'un programme de discussion, vous voudriez aussi le faire sur un autre descripteur de fichier, comme votre socket chat tcp. Donc, vous pouvez tester pour entrer à la fois avec un appel.
Dans le cas de la console Windows, vous devriez pouvoir utiliser GetStdHandle et WaitForSingleObject/WaitForMultipleObjects si select ne fonctionne pas pour vous.
c'est Windows OS – frx08
Windows a une couche de compatibilité POSIX et supporte select(). –
@ frx08: Si c'est Windows, est-ce la console? windows gui? vous devriez le spécifier aussi. –
Il y a plusieurs façons de procéder dans Windows. En supposant que vous utilisez VC++, le plus simple est probablement d'utiliser _kbhit()
. Si vous souhaitez utiliser directement l'API Win32, vous pouvez appeler le GetNumberOfConsoleInputEvents()
et voir si le retour est différent de zéro.
Vous pouvez également faire une lecture avec chevauchement, et chaque fois par l'appel de la boucle WaitForSingleObject
avec une valeur de délai d'attente de 0. L'attente zéro signifie qu'il reviendra immédiatement s'il y a entrée ou non. La valeur de retour vous indiquera si vous avez des données: WAIT_TIMEOUT signifie qu'aucune donnée n'a encore été lue, et WAIT_OBJECT0 signifie que vous avez des données en attente de traitement.
Comment réinitialiser le handle stdin de l'état signalé après avoir utilisé kbhit()/getch() dans une boucle pour lire les clés à partir du tampon? –
@techtonik: Si vous utilisez la poignée, vous voudrez probablement utiliser les fonctions de la console. –
- 1. c tandis que l'entrée en boucle
- 2. C# flotteur boucle infinie
- 3. Boucle infinie sur la combinaison de RewriteRules
- 4. Rotation faire tandis que PHP
- 5. Aide avec Python tandis que le comportement de la boucle
- 6. Nichée tandis que le comportement de la boucle en R
- 7. Faire une boucle infinie en téléchargeant un fichier en C++?
- 8. Non Stackoverflow: objet automatique à l'intérieur tandis que la boucle
- 9. pouvez-vous empêcher un php tandis que la boucle d'erreur?
- 10. jQuery boucle infinie sur les éléments RSS
- 11. Problèmes avec la boucle infinie
- 12. Java boucle infinie/appels
- 13. Arel provoquant une boucle infinie sur l'agrégation
- 14. Jquery - boucle infinie
- 15. rendu en boucle infinie
- 16. Boucle infinie dans FreeBSD
- 17. boucle infinie fermeture ensime
- 18. La répétition de Pascal ... jusqu'à ce que C soit fait ... tandis que
- 19. Boucle infinie SQL-Server
- 20. Aide Jquery nécessaire boucle infinie?
- 21. Boucle infinie attendre 2 secondes, faire appel serveur jquery
- 22. C++ boucle de sortie basée sur l'entrée au clavier
- 23. Android en boucle infinie ListView?
- 24. C++: Boucle infinie avec une simple sélection de menu
- 25. Selector.select() démarre une boucle infinie
- 26. std :: map :: effacer la boucle infinie
- 27. Boucle infinie possible dans mod_rewrite?
- 28. middleware django rediriger boucle infinie
- 29. tout en boucle, postmarkapp, tandis que la boucle l'a envoyé bizarre?
- 30. Comment faire une boucle infinie dans le code Lua?
Vous recherchez l'instruction 'break'? –
Non, je pense qu'il cherche un moyen d'effectuer une lecture non bloquante à partir de stdin –
non j'en ai besoin sans confirmation à chaque fois EDIT: exactement – frx08