#!perl -slw use strict; package threads::Tail; use threads; use threads::shared; use Thread::Queue; our @ISA = 'Thread::Queue'; my $die:shared = 0; sub tail{ my( $Q, $filename, $delay ) = @_; open my $fh, '<', $filename or die "$filename: $!"; seek $fh, 0, 2; until( $die ) { my $line = <$fh>; Win32::Sleep( $delay ), next unless defined $line; $Q->enqueue( $line ); } } sub new { my( $class, $filename, %args ) = @_; my $Q = new Thread::Queue; threads->new( \&tail, $Q, $filename, $args{ delay } || 100 )->detach; return bless $Q, $class; } sub DESTROY { $die = 1; sleep 1; return; } 1; package main; #use threads::Tail; my $Q = threads::Tail->new( $ARGV[ 0 ], delay => 100 ); require Tk::Text; my $mw = MainWindow->new( -width => 400, -height => 400 ); my $text = $mw->Text( -wrap => 'none', -height => 20, )->pack( -expand => 1 ); my $repeat; $repeat = $mw->repeat( 100 => sub { while( $Q->pending ) { my $line = $Q->dequeue; return unless $line; $text->insert( 'end', $line ); $text->yview( 'end' ); } } ); $mw->MainLoop;