• Publicidad

Pausar y reanudar un programa

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Pausar y reanudar un programa

Notapor colorado » 2011-07-10 03:28 @186

Tengo el siguiente código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open (PALABRAS, 'palabras.txt');
  2. my @palabras = <PALABRAS>;
  3. chomp @palabras;
  4. close(PALABRAS);
  5.  
  6. for ( $i = 0; $i < @palabras; $i++ ) {
  7.  
  8. print $palabras[$i],"\n";
  9.  
  10. sleep(20);
  11.  
  12. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


palabras.txt:

Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
aaa
bbb
ccc
ddd
eee
fff
ggg
hhh
iii
jjj
kkk
lll
mmm
nnn
ooo
ppp
qqq
rrr
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


¿Cómo podría pausar y después reanudar el programa (pulsando una tecla o una combinación de teclas) en el mismo punto donde hice la pausa?
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Publicidad

Re: Pausar y reanudar un programa

Notapor explorer » 2011-07-10 05:19 @263

Si estás en un sistema UNIX/Linux, te basta con pulsar Control+S y Control+Q para parar/continuar la salida en la terminal donde estás ejecutando el programa.

Por regla general, esto es también la misión de la tecla Pausa/Interrupción del teclado.

Yo suelo usar el comando less (more, en MSDOS) para ver la salida de procesos que generan muchas líneas. También suelo usar el comando tail con la opción -f o -F.

Pero otra opción sería hacerlo de forma programada, claro...

Para ello, dentro del bucle, hay que mirar si se ha pulsado alguna tecla, ver qué tecla es, si es la tecla de pausa, hacer una pausa (por ejemplo, un simple input con el operador <> podría valer; o haciendo otro bucle donde esperamos otra pulsación), y seguir.

Hummm... es más cómodo usar less ;)

¿De verdad que necesitas programar esa pausa dentro del propio programa? Si tienes un ordenador rápido, puede que salga toda la salida incluso antes de que la mano llegue a tocar la tecla de pausa.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pausar y reanudar un programa

Notapor pvaldes » 2011-07-10 05:41 @278

Alternativamente podrías dividir la orden print() para que se desarrolle en varios pasos:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for ( $i = 0; $i < @palabras / 4; $i++ ) {
  2.     print $palabras[$i], "\n";
  3.     sleep(20);
  4.     print "primer cuarto";
  5. }
  6.  
  7. for ( $i = @palabras / 4 < @palabras / 2; $i++ ) {
  8.     print $palabras[$i], "\n";
  9.     sleep(20);
  10.     print "segundo cuarto";
  11. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

etc... No he comprobado si funciona, es sólo una idea pero parece sencilla de implementar, sólo tienes que dividir tus datos totales en bloques de n líneas, donde n es la capacidad máxima de líneas que puedes ver en pantalla de cada vez. Es como usar less, pero automático.
Última edición por explorer el 2011-07-10 10:43 @488, editado 1 vez en total
Razón: Formateado de código con Perltidy y poner marcas Perl
pvaldes
Perlero nuevo
Perlero nuevo
 
Mensajes: 129
Registrado: 2011-01-22 12:56 @580

Re: Pausar y reanudar un programa

Notapor colorado » 2011-07-10 15:04 @670

Si estás en un sistema UNIX/Linux, te basta con pulsar Control+S y Control+Q para parar/continuar la salida en la terminal donde estás ejecutando el programa.

Por regla general, esto es también la misión de la tecla Pausa/Interrupción del teclado.

Muchas gracias por las respuestas.

Mi sistema operativo es XP.

Control+S y Control+Q y la tecla Pausa/Interrupción del teclado hacen funcionar el programa como quiero. No conocía esas teclas, solucionado el problema.

¿De verdad que necesitas programar esa pausa dentro del propio programa? Si tienes un ordenador rápido, puede que salga toda la salida incluso antes de que la mano llegue a tocar la tecla de pausa.

Sí, por eso puse el sleep(), para que me diera tiempo a interactuar con el programa.

Otra cosa:

Para salir del programa antes de su finalización, utilizo Control+C. Al volver a ejecutar el programa, como es lógico, vuelve a empezar por el primer elemento del array. ¿Podría memorizar de alguna forma el último elemento donde se quedó el programa, después de ejecutar Control+C?

Es decir:

Ejecuto prueba.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
aaa pausa de 20
bbb pausa de 20
ccc pausa de 20
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Control+C salgo del programa

Ejecuto prueba.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
ddd
eee
fff
...
..
.
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Pausar y reanudar un programa

Notapor explorer » 2011-07-10 15:58 @707

colorado escribiste:¿Podría memorizar de alguna forma el último elemento donde se quedó el programa, después de ejecutar Control+C?

Bueno, guardando el número de línea leída en un archivo en disco, por ejemplo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Pausar y reanudar un programa

Notapor colorado » 2011-07-10 17:53 @786

Gracias por la pista, explorer.

Así me quedó:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. open( PALABRAS, 'palabras.txt' );
  2. my @palabras = <PALABRAS>;
  3. chomp @palabras;
  4. close(PALABRAS);
  5.  
  6. open( NUMERO, 'nl.txt' );
  7. my $numero = <NUMERO>;
  8. close(NUMERO);
  9.  
  10. for ( $i = $numero; $i < @palabras; $i++ ) {
  11.     open( FILE, ">   nl.txt" );
  12.     binmode FILE;
  13.     print FILE $i;
  14.     close(FILE);
  15.     print $palabras[$i], "\n";
  16.  
  17.     sleep(5);
  18.  
  19. }
  20.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


funciona bien :)
colorado
Perlero nuevo
Perlero nuevo
 
Mensajes: 73
Registrado: 2010-01-31 14:48 @658

Re: Pausar y reanudar un programa

Notapor explorer » 2011-07-11 05:40 @278

bueno, pero es un poco ineficiente... estar teniendo que abrir y cerrar el archivo, en cada vuelta.

Es casi mejor,

* abrir el archivo al principio, antes del bucle

* usar seek() para posicionar el puntero de escritura al principio del archivo

* ya puedes escribir

* también antes del bucle, capturar la señal de paro (con el control-C), para que una subrutina haga un close limpio del archivo. Algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $SIG{INT} = \&subrutina_de_paro;
  2.  
  3. sub subrutina_de_paro {
  4.     close $FILE;
  5. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


* en vez de usar FILE, es mejor usar my $FILE, para que así pueda ser usado en otras partes del programa, como el caso de la subrutina anterior.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron