note
BrowserUk
<blockquote><i></i></blockquote>
<p>Pairing the clumsy Thread::Semaphore with the should-never-have-been-invented "threads signalling" is an extremely convoluted way of controlling a producer thread.
<p>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:<code>
#! 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;
</code>
<P>Update: Simplified the code a little.
<div class="pmsig"><div class="pmsig-171588">
<hr />
<font size=1 >
<div>With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'</div>
<div>Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.</div>
<div>"Science is about questioning the status quo. Questioning authority". </div>
<div>In the absence of evidence, opinion is indistinguishable from prejudice.
<p align=right>[http://www.theregister.co.uk/2011/11/29/sas_versus_world_programming/|The start of some sanity?]</p></div>
</font>
</div></div>
953739
953739