http://www.perlmonks.org?node_id=953775


in reply to controlling threads with Tk: while loop vs. signals

Pairing the clumsy Thread::Semaphore with the should-never-have-been-invented "threads signalling" is an extremely convoluted way of controlling a producer thread.

This does what I think you were trying to achieve -- start the thread 'suspended' and allow it to be resumed and suspended -- with rather less fuss and complication:

#! perl -slw use strict; use threads; use threads::shared; use Thread::Queue; use Tk; my $sem :shared = 0; sub thread { my( $Q, $file ) = @_; open my $fh, '<', $file or die $!; while( <$fh> ) { lock $sem; cond_wait( $sem ); $Q->enqueue( $_ ); } } my $Q = new Thread::Queue; my $t = async( \&thread, $Q, $ARGV[0] )->detach; my $mw = MainWindow->new; $mw->geometry( "1024x768" ); my $b1; $b1 = $mw->Label->pack( -anchor => 'nw' )->Button( -width => 10, -text => 'start', -command => sub{ if( $sem ) { $b1->configure( -text => 'resume' ); lock $sem; cond_signal( $sem ); $sem = 0; } else{ $b1->configure( -text => 'suspend' ); lock $sem; cond_signal( $sem ); $sem = 1; } } )->pack( -side => 'left' ); my $lb = $mw->Scrolled( 'Listbox', -height => 55, -scrollbars => 'e' )->pack( -anchor => 's', -fill => 'both' )->Subwidget('scrolled'); my $repeat = $mw->repeat( 1 => sub { while( $Q->pending ) { $lb->insert( 'end', $Q->dequeue ); $lb->see( 'end' ); $mw->update; lock $sem; $sem and cond_signal( $sem ); } }); $mw->MainLoop;

Update: Simplified the code a little.


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

The start of some sanity?