use strict; use Threads; use Tk; use Thread::Queue; use Tk::ProgressBar; my $comm = new Thread::Queue; my ($mw, $percent_done)=create_gui(); threads->new(\&go, $comm, $percent_done)->detach; $mw->repeat( 100, [\&updateScreen, $comm, $percent_done] ); MainLoop(); sub create_gui { my $percent_done=0; my $mw = MainWindow->new( -title => 'Test'); $mw->Label( -text => "percent_done" )->pack; $mw->ProgressBar(-variable => \$percent_done)->pack; $mw->Button ( -text => "Clear", -command => sub {$percent_done=0} )->pack; return ($mw, $percent_done); } sub go { my ($comm, $percent_done)=@_; while(1) { $comm->enqueue( $percent_done+5); select undef, undef, undef, 0.1; } } sub updateScreen { my ($comm, $percent_done)=@_; ($percent_done = $comm->dequeue ) if $comm->pending; }