ProgressBar set_text
- From: "Jeffrey Ratcliffe" <jeffrey ratcliffe gmail com>
- To: gtk-perl-list gnome org
- Subject: ProgressBar set_text
- Date: Tue, 17 Jul 2007 10:16:30 +0200
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]