Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
838 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°775297
HannibAlBu​ndie
Posté le 24-06-2004 à 10:06:05  profilanswer
 

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
mood
Publicité
Posté le 24-06-2004 à 10:06:05  profilanswer
 

n°798820
Taz
bisounours-codeur
Posté le 18-07-2004 à 12:00:58  profilanswer
 

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

n°801237
Tamahome
⭐⭐⭐⭐⭐
Posté le 20-07-2004 à 20:46:01  profilanswer
 

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
n°801246
Taz
bisounours-codeur
Posté le 20-07-2004 à 20:53:27  profilanswer
 

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 ...

n°814397
jaylee
Posté le 04-08-2004 à 02:00:15  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
executer une procedure oracle dans la consoleConsole VS IHM
[C++] commande pour quitter un prog sous console ???Console java dans un applet
[debutant] affichage en mode consoleEffacer l'écran en mode console [Résolu]
[Mysql/PhpMyadmin] Table Is Read Only[C(++)/Pascal] Coder une console: pointer une chaine sur procedure ?
[C]problème read sur port sérieLecture du clavier non bloquant
Plus de sujets relatifs à : [C#] Console.Read() non bloquant ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR