ProgressBar set_text



I have a ProgressBar tracking a forked process below. There is
presently a debugging line

print "$1 $2\n";

With this left in, the text in the ProgressBar is updated OK. Without
the print statement, the text is not updated.

What is going on?

Jeff

#!/usr/bin/perl

use warnings;
use strict;
use Socket;
use Gtk2 -init;
use Glib qw(TRUE FALSE);             # To get TRUE and FALSE
use FileHandle;
use POSIX;

# Create the windows
my $window = Gtk2::Window->new('toplevel');
my $box = Gtk2::VBox->new;
my $pbar = Gtk2::ProgressBar->new;
my $buttonQuit = Gtk2::Button->new('Quit');
my $buttonStart = Gtk2::Button->new('Start');

$window->add ($box);
$box->add ($pbar);
$box->add($buttonQuit);
$box->add($buttonStart);

my %helperTag;

# Process the exit of the child. If you were doing something useful,
# you might keep things like information about what data needs
# to be reloaded when a child process exits.

sub sig_child {
 my $pid = wait;
 if ($pid >= 0) {
 delete $helperTag{$pid};
}
}

$SIG{CHLD} = \&sig_child;

sub start_process {
 my $pid;

my ($reader, $writer);
 $reader = FileHandle->new;
 $writer = FileHandle->new;
 socketpair($reader, $writer,  AF_UNIX, SOCK_STREAM, PF_UNSPEC);

 $pid = fork();

 if ($pid) {
 # We're still in the parent, set up to watch the streams:

 shutdown($writer, 0);
 my $line;
 $helperTag{$pid} = Glib::IO->add_watch($reader->fileno(), ['in', 'hup'], sub {
  my ($fileno, $condition) = @_;

  if ($condition & 'in') { # bit field operation. >= would also work
   my $line = <$reader>;
   if ($line =~ /(\d*\.?\d*)(.*)/) {
print "$1 $2\n";
    $pbar->set_fraction($1);
    $pbar->set_text($2);
   }
  }

# Can't have elsif here because of the possibility that both in and hup are set.
# Only allow the hup if sure an empty buffer has been read.
  if (($condition & 'hup') and (! defined($line) or $line eq '')) { #
bit field operation. >= would also work
   return FALSE;  # uninstall
  }
  return TRUE;  # continue without uninstalling
 });
}
else {
    # We're in the child. Do whatever processes we need to. We *must*
    # exit this process with POSIX::_exit(...), because exit() would
    # "clean up" open file handles, including our display connection,
    # and merely returning from this subroutine in a separate process
    # would *really* confuse things.

 shutdown($reader, 1);
 $pid = getpid();
 my $n = 4;
 for (my $i = 0; $i <= $n; $i++)
 {
  sleep(1);
  $writer->write($i/$n."Running $i of $n\n");
  $writer->flush;
 }
 POSIX::_exit(0);
}
}


# We should clean up after ourselves so that we don't
# leave dead processes flying around.
sub on_quit_clicked {
   # 15 = SIGTERM
 kill 15, $_ foreach (keys %helperTag);
Gtk2->main_quit;
}


# We should also link this to the destroy message on the main window,
# this is just quick and dirty
$buttonQuit->signal_connect(clicked => \&on_quit_clicked);
$buttonStart->signal_connect(clicked => \&start_process);
$window->show_all;
Gtk2->main;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]