Here ya go. Put the long running code into the work() sub and periodically update $progress (as shown) with a value between 0-100.
#!perl -slw
use strict;
use threads qw[ async ];
use threads::shared;
our $WORKMAX ||= 1_000;
## A shared var to communicate progess between work thread and TK
my $progress : shared = 0;
sub work{
for my $item ( 0 .. $WORKMAX ) {
{ lock $progress; $progress = ( $item / $WORKMAX ) * 100; }
select undef, undef, undef, 0.001; ## do stuff that takes time
}
}
threads->new( \&work )->detach;
## For lowest memory consumption require (not use)
## Tk::* after you've started the work thread.
require Tk::ProgressBar;
my $mw = MainWindow->new;
my $pb = $mw->ProgressBar()->pack();
my $repeat;
$repeat = $mw->repeat( 100 => sub {
print $progress;
$repeat->cancel if $progress == 100;
$pb->value( $progress ) }
);
$mw->MainLoop;
Examine what is said, not who speaks.
"Efficiency is intelligent laziness." -David Dunham
"Think for yourself!" - Abigail
"Memory, processor, disk in that order on the hardware side. Algorithm, algoritm, algorithm on the code side." - tachyon