Re: Glib::IO watcher unbuffered?



On Fri, 19 Jan 2007 09:24:53 +0100
"Philipp E. Letschert" <phil uni-koblenz de> wrote:

I would like to have unbuffered output processing from an external command
(command prints a line, sleeps, prints a line, sleeps ...):

   else {
       my $line = <$pipe>;

I tried to have $line processed without delay (autoflush all handles
everywhere...), but the watcher only prints bunches of lines after some longer
delay. 
Why does the buffering happen and how to turn it off?


I think your problem is that <> blocks until it hits an EOF, but your
pipe never sends it.  It's a common problem with running top thru
a pipe. Try using sysread:

#!/usr/bin/perl -w
use strict;
use Glib  qw(TRUE FALSE);
use Gtk2 -init;
use Gtk2::Helper;

open(FH, "top -b |") or die "$!\n";

my $helper_tag = Gtk2::Helper->add_watch(fileno FH, 'in',sub{
                        &watch_callback('FH');
            });

#standard window creation, placement, and signal connecting
my $window = Gtk2::Window->new('toplevel');
$window->signal_connect('delete_event' => sub { exit;});
$window->set_border_width(5);
$window->set_position('center_always');

my $hbox = Gtk2::HBox->new();
$hbox->set( "border_width" => 0 );
$window->add($hbox);

my $scroll   = Gtk2::ScrolledWindow->new;
$scroll->set_size_request(600,600);
my $textview = Gtk2::TextView->new;
my $buffer = $textview->get_buffer;
create_tags($buffer);

$scroll->add($textview);
$hbox->pack_start($scroll,1, 1, 1 ); # expand?, fill?, padding;

$window->show_all();

#our main event-loop
Gtk2->main;

sub watch_callback {

        my ($fh) = @_;
        
        my $line;
        #read 1000 caracters of the buffer
        #$fh->sysread($line,1000);
        sysread(FH,$line,4096);
          
        #remove the newline
        chomp $line;
        
        if($line){
           $buffer->insert_with_tags_by_name($buffer->get_end_iter, $line,'blue');
        }else{
           Gtk2::Helper->remove_watch($helper_tag);                              
        }

        # need the main iteration here 
        Gtk2->main_iteration while Gtk2->events_pending;
        $textview->scroll_to_iter($buffer->get_end_iter,0,0,0,0);

        #important so we can loop again 
        return 1;
}
#########################################################3
sub create_tags{
  my $buffer = shift; 

   $buffer->create_tag('blue',
           foreground => 'blue',
           );

   $buffer->create_tag('col',
           foreground => 'green',
           );

}
#############################################################################
__END__


zentara


-- 
I'm not really a human, but I play one on earth.
http://zentara.net/japh.html



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