He creado un proceso en un programilla de perl-gtk2 y Glade con la intención de que los widgets me sigan respondiendo mientras se desarrolla el proceso.
Tengo dos botones. Uno que arranca el proceso y otro que lo detiene. Al arrancar el proceso pongo el botón que lo arranca insensible ($btn_arrancar->sensitive('0')) y el cursor con un reloj de espera.
El caso es que si detengo el proceso con el botón de detener, tanto el cursor como el estado del otro botón vuelven a la normalidad. Sin embargo, cuando el proceso se detiene por sí mismo el estado del botón continúa insensible y el cursor de reloj se mantiene. No doy con el modo de que vuelva a la normalidad tras el fin natural del proceso.
Gracias por la atención.
Este es el código:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use strict;
- use Gtk2 'init';
- use Gtk2::GladeXML;
- use vars qw($nproc);
- my $glade_app = Gtk2::GladeXML->new("$ENV{'HOME'}/bin/Glade/GtkCNMV/pruebas/gtkfork.xml");
- my $cursor_normal = Gtk2::Gdk::Cursor->new('left_ptr');
- my $cursor_ocupado = Gtk2::Gdk::Cursor->new('watch');
- my $win = $glade_app->get_widget('window1');
- my $btn_arrancar = $glade_app->get_widget('button1');
- my $btn_detener = $glade_app->get_widget('button2');
- $btn_arrancar->signal_connect( 'clicked' => \&arrancar );
- $btn_detener->signal_connect( 'clicked' => \&detener );
- $win->signal_connect( 'delete_event' => sub { Gtk2->main_quit; } );
- $win->show_all;
- Gtk2->main;
- sub arrancar {
- $btn_arrancar->set_sensitive('0');
- $btn_arrancar->window->set_cursor($cursor_ocupado);
- my $PID = fork();
- if ($PID) {
- $nproc = $$;
- # Mi manera cutre de pasar el número de proceso :)
- open( TMP, ">/tmp/nproc" ) or die "Error: $!\n";
- print TMP $nproc;
- close TMP;
- foreach ( 0 .. 3 ) {
- print ">> $_\n";
- sleep 1;
- detener() if ( $_ >= 3 );
- }
- }
- else { return "No hay fork: $!\n"; }
- return;
- }
- sub detener {
- $btn_arrancar->set_sensitive('1');
- $btn_arrancar->window->set_cursor($cursor_normal);
- open( TMP, "</tmp/nproc" ) or die "Error: $!\n";
- $nproc = $_ while (<TMP>);
- close TMP;
- print "Terminando $nproc...\n";
- kill TERM => $nproc;
- return;
- }
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4