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".
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|