2010-02-25 4 views
2

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

+3

Vous recherchez l'instruction 'break'? –

+0

Non, je pense qu'il cherche un moyen d'effectuer une lecture non bloquante à partir de stdin –

+0

non j'en ai besoin sans confirmation à chaque fois EDIT: exactement – frx08

Répondre

6

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.

+0

c'est Windows OS – frx08

+0

Windows a une couche de compatibilité POSIX et supporte select(). –

+0

@ frx08: Si c'est Windows, est-ce la console? windows gui? vous devriez le spécifier aussi. –

2

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.

+0

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? –

+0

@techtonik: Si vous utilisez la poignée, vous voudrez probablement utiliser les fonctions de la console. –