in reply to Re^2: Tk and Threads
in thread Tk and Threads
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^4: Tk and Threads
by Dirk80 (Pilgrim) on Dec 22, 2010 at 10:56 UTC | |
by BrowserUk (Patriarch) on Dec 22, 2010 at 11:04 UTC | |
by Dirk80 (Pilgrim) on Dec 22, 2010 at 12:01 UTC | |
by BrowserUk (Patriarch) on Dec 22, 2010 at 12:27 UTC | |
by Dirk80 (Pilgrim) on Dec 22, 2010 at 12:40 UTC | |
|