in reply to Re: Thread problems
in thread Thread problems
Hi,
Thank you for the hint with the example of zentara. And thank you for the advice to use Gtk.
I like Tk very much and yesterday arrived the book "Mastering Perl/Tk". So I'd like to stay with Tk at the moment. I nearly finished an application with Tk now and I only need this small thread thing to complete.
Now I could create a solution. Here is the code what is doing what I want.
#!/usr/bin/perl use warnings; use strict; use threads; use threads::shared; my $work:shared = 0; my $die:shared = 0; #create thread before any tk code is called my $thr = threads->create( \&worker ); use Tk; my $mw = MainWindow->new(); $mw->protocol('WM_DELETE_WINDOW' => sub { &clean_exit }); my $button_stop = $mw->Button(-text => 'Stop thread', -command => sub { $work = 0; })->pack(); my $button_start = $mw->Button(-text => '(Re)Start thread', -command => sub { $work = 0; sleep(1); $work = 1; })->pack(); MainLoop; sub clean_exit { my @running_threads = threads->list; if (scalar(@running_threads) > 1) { print "ERROR: Too many threads are active. This was not planne +d!\n"; } elsif (scalar(@running_threads) == 1) { $work = 0; $die = 1; $thr->join; exit; } else { print "ERROR: There should be at least one thread started!\n"; } } # no Tk code in thread sub worker { my $i; THREAD_START: while($work == 0) { # just wait if( $die == 1 ) { return; } } $i = 0; while($work == 1) { print $i . "\n"; $i++; } if( $die == 0 ) { goto THREAD_START; } }
Hopefully you monks can tell me how to improve this code. Using goto is bad and waiting for an event in a loop is also not the best style and costs a lot of performance. But I don't know how to solve it in a different way.
Greetings
Dirk
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^3: Thread problems
by zentara (Cardinal) on Dec 04, 2009 at 18:29 UTC | |
by Dirk80 (Pilgrim) on Dec 11, 2009 at 15:55 UTC | |
by zentara (Cardinal) on Dec 11, 2009 at 16:10 UTC | |
by Dirk80 (Pilgrim) on Dec 13, 2009 at 18:55 UTC |