Página 1 de 1

Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 15:10 @674
por _behoimi
Hola, quisiera saber cómo se puede capturar una tecla del teclado, pero que no me lo solicite explícitamente, es decir, que no se detenga el bucle que se está ejecutando.

Dejaré mi código para que se entienda mejor lo que deseo. Debo mencionar que es sólo con fines educativos que hago este tipo de script, sólo soy un programador aficionado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use strict;
  2. use strict;
  3. use warnings;
  4. use IO::Socket::INET;
  5.  
  6. my $sock = new IO::Socket::INET(
  7.         PeerAddr => $ARGV[0],
  8.         PeerPort => $ARGV[1],
  9.         Proto => 'tcp'
  10. ) or die "error creando el socket: $!";
  11.  
  12. my $count;
  13. my $exit = "";
  14. my $data = "just flood";
  15. while ($exit ne "q"){
  16.         $count ++;
  17.         print $sock $data;
  18.         #aquí necesito saber como capturar una tecla sin detener el bucle.
  19. }
  20. print $count;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Sólo quiero saber cuántos paquetes soy capaz de enviar; también debe ser posible saber cuántos bytes son enviados en mi pequeño mensaje, sumadas las cabeceras y el texto.

Re: Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 15:36 @692
por explorer
Pues... eso depende del sistema operativo en donde estés ejecutando este programa. ¿Cuál es?

Re: Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 15:45 @698
por _behoimi
Estoy en Windows 7 64 bit, y mi versión de Perl es la última de Strawberry.

Re: Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 16:42 @737
por explorer
Puedes intentar usar el módulo Term::ReadKey, pero presta atención a su manual: algunas funciones no están para Windows.

Con un ReadKey -1 debería bastar.

Otra opción, más completa, es usar Win32::Console. Aquí tienes un ejemplo que hace precisamente eso, ver si hay eventos del teclado, y procesarlos.

Esta pregunta está en las FAQ de Perl, en perlfaq5 en concreto, pero la respuesta es algo liosa:
https://learn.perl.org/faq/perlfaq5.htm ... e-keyboard

Re: Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 17:17 @761
por Aceitunas
Si necesitas que el bucle no se pause mientras esperas la pulsación, tienes que crear un nuevo hilo. Por otra parte te comento que para obtener una pulsación de una tecla en Windows puedes usar la función GetAsynckeyState.

https://msdn.microsoft.com/es-es/librar ... 93(v=vs.85).aspx

Un saludo.

Re: Capturar una tecla sin detener un bucle

NotaPublicado: 2018-01-14 20:29 @895
por _behoimi
Con Term::ReadKey pude lograr lo que quería, no fue nada complicado: sólo cambié la condición del bucle while() a:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. while (not defined (my $exit = ReadKey(-1))){
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

y voilá. También declaré el uso del módulo, claro.

Gracias.