8
votes

C ++ Entrée et sortie à la fenêtre de la console en même temps

J'écris un serveur (principalement pour Windows, mais ce serait cool si je pouvais le garder multiplateforme) et je viens d'utiliser une fenêtre de console normale pour elle. Cependant, je souhaite que le serveur puisse faire des commandes telles que Say_To_say_Here ou Kick Playername, etc. Comment puis-je avoir une entrée / sortie asynchrone? J'ai déjà essayé des trucs avec le printf normal () et les gets_s, mais cela a entraîné une chose vraiment ... des choses étranges.

Je veux dire quelque chose comme ça 1

Merci.


3 commentaires

Bouchon Shameless :-)


Il suffit de simuler un gestionnaire d'interruption. Vous serez bon d'aller, je suppose.


"Si je pouvais le garder multiplateforme"? Qu'est-ce qui vous arrête?


4 Réponses :


0
votes

Vous pouvez essayer de placer l'entrée et la sortie sur des threads distincts. Je ne suis pas tout à fait sûr de savoir pourquoi vous voulez faire cela, mais le filetage devrait faire le travail. :)

http://fr.wikibooks.org/wiki/c++_programming/ Filetage


1 commentaires

Oui, les opérations asynchrones sont souvent faites avec des threads, mais le problème est le fait que les opérations d'E / S de la bibliothèque standard ne sont pas multithread-Safe ... Donc, des threads multiples essayant de lire et d'écrire sur la console entraîneront toutes sortes de petites sortes de entrelacement imprévisible d'écritures. Vous devez donc mettre en œuvre un type de verrouillage avant d'accéder à une opération d'E / S.



3
votes

Vous pouvez simuler des E / S asynchrones à l'aide de threads, mais plus important encore, vous devez partager un mutex entre les deux threads de lecture / écriture afin d'éviter tout problème avec un fil d'accueil sur un autre fil et d'écrire sur la console sur le dessus. de la sortie d'un autre fil. En d'autres termes std :: cout , std :: Cin , fprintf () , etc. ne sont pas multi-threads sûrs et en tant que Résultat, vous obtiendrez un motif d'entrelacement imprévisible entre les deux opérations où une lecture ou une écriture a lieu, tandis qu'une autre lecture ou écrite se produisait déjà. Vous pourriez facilement vous retrouver avec une lecture en train d'essayer de se dérouler au milieu d'une écriture et, en outre, lorsque vous tapez une entrée sur la console, un autre fil d'écriture pourrait commencer à écrire sur la console, faisant un gâchis visuel de ce que vous avez 'Essayez de taper comme entrée.

Afin de gérer correctement vos fils de lecture et d'écriture asynchrones, il serait préférable de configurer deux classes, une pour la lecture et une autre pour écrire. Dans chaque classe, configurez une file d'attente de messages qui stockera des messages (le plus probable std :: string ) pour le fil principal pour récupérer dans le cas du thread de lecture et pour le fil principal de pousser les messages dans le cas du fil d'écriture. Vous pouvez également vouloir créer une version spéciale de votre fil de lecture pouvant imprimer une invite, avec un message poussé dans sa file d'attente de messagerie par le fil principal qui imprimera une invite avant de lire à partir de stdin ou Std :: Cin . Les deux classes partageront alors un mutex commun ou un sémaphore pour empêcher l'entrelacement imprévisible des E / S. En verrouillant le mutex commun avant tout iOSTream appels (un déverrouillage par la suite), toute entrelacement imprévisible des E / S sera évitée. Chaque thread ajoutera également un autre mutex unique à chaque fil qui peut être utilisé pour maintenir l'exclusivité sur l'accès à la file d'attente de messagerie interne de la classe. Enfin, vous pouvez implémenter les files d'attente de messages dans chaque classe sous forme de STD :: Queue .

Si vous souhaitez effectuer votre programme aussi plate-forme que possible, je vous suggérerais de la mettre en œuvre avec Boost :: threads ou à l'aide des bibliothèques NEW C ++ 0X STD :: Filets.


0 commentaires

1
votes

Si vous abandonnez la fenêtre de la console et utilisez des connexions TCP pour la commande et le contrôle, votre serveur sera beaucoup plus facile de garder la multiplate-forme multi-plateformes, ainsi que plus simple et plus flexible.


0 commentaires

8
votes

code rapide pour tirer parti des fonctionnalités C ++ 11 (c'est-à-dire une plate-forme croisée) xxx


0 commentaires