[C#] Console.Read() non bloquant ?

Console.Read() non bloquant ? [C#] - C#/.NET managed - Programmation

Marsh Posté le 24-06-2004 à 10:06:05    

Bonjour,
 
J'aimerais savoir si il existe une méthode du type Console.Read() mais en version non bloquante :ange:?
 
J'explique un peu plus :
A un moment donné, j'aimerais savoir si l'utilisateur a saisi quelque chose. Si oui, j'aimerais alors connaitre ce qu'il a tapé. Mais dans le cas contraire, je ne veux pas que la méthode bloque en attendant qu'il saisisse quelque chose, juste qu'elle m'informe que rien n'a été saisi.
 
Si malheureusement aucune méthode de ce type n'existe (ce que je crains fort :(), n'auriez vous pas une astuce pour obtenir un tel comportement ?
J'ai bien pensé à threader l'appel à Console.ReadLine() et à lui appliquer Abort() si il est toujours en vie au bout d'un certain temps, mais ça fait un peu barbare non :sweat:?
 
Toute proposition est donc la bienvenue :hello:.
 
Merci d'avance :jap:


Message édité par HannibAlBundie le 24-06-2004 à 11:13:27
Reply

Marsh Posté le 24-06-2004 à 10:06:05   

Reply

Marsh Posté le 18-07-2004 à 12:00:58    

a froid, je te dirais de jouer avec System.IO.AsyncCallback

Reply

Marsh Posté le 20-07-2004 à 20:46:01    

a froid je dirais de chercher un event sur KeyDown mais apparemment t'es pas dans une winform...
 
Edit : quoique si c'est juste une appli console, tu peux "imiter" ca dans une winform en mettant un gros Textbox :D


Message édité par Tamahome le 20-07-2004 à 20:46:47
Reply

Marsh Posté le 20-07-2004 à 20:53:27    

moi je suis curieux de l'approche, le truc qui déclenche un callback, ça me parait assez chiatique. J'aime bien l'approche select() ou alors une exception est lancée lorsque la lecture et échoue, on capture et fait autre chose. là, avec un AsyncCallback faudrait foutre tout son code de traitement à 4kilomètes de sa boucle de lecture, bof ... et de toutes façons, je vois pas vraiment comment ça s'exploite, alors ça doit pas être ça ...

Reply

Marsh Posté le 04-08-2004 à 02:00:15    

HannibAlBundie a écrit :

Bonjour,
 
J'aimerais savoir si il existe une méthode du type Console.Read() mais en version non bloquante :ange:?
 
J'explique un peu plus :
A un moment donné, j'aimerais savoir si l'utilisateur a saisi quelque chose. Si oui, j'aimerais alors connaitre ce qu'il a tapé. Mais dans le cas contraire, je ne veux pas que la méthode bloque en attendant qu'il saisisse quelque chose, juste qu'elle m'informe que rien n'a été saisi.
 
Si malheureusement aucune méthode de ce type n'existe (ce que je crains fort :(), n'auriez vous pas une astuce pour obtenir un tel comportement ?
J'ai bien pensé à threader l'appel à Console.ReadLine() et à lui appliquer Abort() si il est toujours en vie au bout d'un certain temps, mais ça fait un peu barbare non :sweat:?
 
Toute proposition est donc la bienvenue :hello:.
 
Merci d'avance :jap:


 
 
Le Framework .NET 1.1 ne permet pas de lire un seul caractère sur la console. Toutes les fonctions de lecture ne retourneront qu'après un appui sur Enter effectué par l'utilisateur.
 
Cependant, si tu ne veux que des lignes complètes et que tu veux asynchroniser le tout, tu peux utiliser la méthode suivante :
 

Code :
  1. class Class1
  2.   {
  3.     private ManualResetEvent _exitEvent = new ManualResetEvent(false);
  4.     private byte[] _buffer = new byte[1];
  5.     private Stream _consoleStream;
  6.     void OnLineRead(IAsyncResult result)
  7.     {
  8.       int numRead = _consoleStream.EndRead(result);
  9.       if(_buffer[0] == 'e')
  10.         _exitEvent.Set();
  11.       else
  12.         _consoleStream.BeginRead(_buffer, 0, 1, new AsyncCallback(OnLineRead), null);
  13.     }
  14.     void Run()
  15.     {
  16.       _consoleStream = Console.OpenStandardInput();
  17.       _consoleStream.BeginRead(_buffer, 0, 1, new AsyncCallback(OnLineRead), null);
  18.       _exitEvent.WaitOne();
  19.     }
  20.     static void Main(string[] args)
  21.     {
  22.       new Class1().Run();           
  23.     }
  24.   }


 
Le modèle de fonctionnement est assez simple. Le plus simple est d'ajouter une thread supplémentaire pour effectuer les opérations asynchrones. Tu peux notifier de l'arrivée d'une chaine par l'intermédiaire d'un event (keyword event et non pas WaitHandle), et effectuer des traitement appropriés.
 
En passant par la, le Framework 2.0 proposera une méthode appelée Console.ReadKey, avec la possibilité de controller l'echo local.
 
--
Jay
{Epitech.}
http://www.labtech.epitech.net/blogs/jaylee

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed