With a minor change to the code I posted, the button can be used to pause & resume the threads:
#!perl -slw use strict; use Time::HiRes qw [ sleep ]; use threads; use Thread::Queue; use constant { IDLE => 0, WORK => 1 }; sub work{ my( $id, $delay, $Q ) = @_; my $n = 0; my $state = WORK; local $SIG{QUIT} = sub{ $state ^= 1 }; while( sleep( $delay ) && ++$n <= 100 ) { sleep 1 while $state == IDLE; $Q->enqueue( "$id:$n" ); } } my $Q = new Thread::Queue; my @threads = map threads->new( \&work, $_, 0.1 * $_, $Q ), 1 .. 2; require Tk::ProgressBar; my $mw = MainWindow->new; my $pb1 = $mw->ProgressBar()->pack(); my $bt1 = $mw->Button( -text => 'Pause/resume thread 1', -command => sub { $threads[0]->kill('QUIT') } )->pack; my $pb2 = $mw->ProgressBar()->pack(); my $bt2 = $mw->Button( -text => 'Pause/resume thread 2', -command => sub { $threads[1]->kill('QUIT') } )->pack; my $repeat; $repeat = $mw->repeat( 100 => sub { while( $Q->pending ) { my( $id, $progress ) = split ':', $Q->dequeue; return unless $progress; ( $id == 1 ? $pb1 : $pb2 )->value( $progress ); if( $id == 2 && $progress == 100 ) { $repeat->cancel; $mw->exit; } } } ); $mw->MainLoop; END{ $_->join for @threads; }
But that is actually easier to achieve using a simple shared variable.
In reply to Re^3: Tk and Threads
by BrowserUk
in thread Tk and Threads
by Dirk80
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |