#!/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 planned!\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; } }