use strict;
use warnings;
$|=1;
print "$_\n" and select(undef,undef,undef,0.1) for 1 .. 1000;
####
#!perl -slw
use strict;
use threads;
use threads::shared;
use Thread::Queue;
## A shared var to communicate progess between work thread and TK
my $Q = new Thread::Queue;
my $pid:shared;
sub work{
$pid = open (CHILD_PROC, "perl child.pl |") or die $!;
while( ) {
$Q->enqueue( $_ );
}
close( CHILD_PROC );
}
threads->new( \&work )->detach;
use Tk;
use Tk::ProgressBar;
my $mw = MainWindow->new;
my $pb = $mw->ProgressBar()->pack();
my $repeat;
$repeat = $mw->repeat( 100 => sub {
while( $Q->pending ) {
my $progress = $Q->dequeue;
return unless $progress;
$repeat->cancel if $progress == 100;
$pb->value( $progress )
}
} );
$mw->Button('-text' => 'Cancel',
'-command' => sub{ kill 9, $pid; exit(0); })->pack();
# No suspend and kill button because
# the signals SIGSTOP and SIGCONT do not exist for Windows
$mw->MainLoop;
####
#!perl -slw
use strict;
use threads;
use threads::shared;
use Thread::Queue;
use Win32::Process;
use Win32;
use Data::Dumper;
sub ErrorReport
{
print Win32::FormatMessage( Win32::GetLastError() );
}
## A shared var to communicate progess between work thread and TK
my $Q = new Thread::Queue;
my $ProcessObj_as_string:shared;
my $ProcessObj;
sub work{
# save STDOUT
open(my $STDOUT_ORIG, ">&", \*STDOUT) or die;
# connect TO_CHILD_PROC with CHILD_PROC
pipe(CHILD_PROC, TO_CHILD_PROC);
# change STDOUT to TO_CHILD_PROC
# --> STDOUT of child process is set to TO_CHILD_PROC and
# this is connected via pipe with CHILD_PROC
open(STDOUT, ">&", \*TO_CHILD_PROC);
Win32::Process::Create($ProcessObj,
"C:\\Perl\\bin\\perl.exe",
"perl child.pl",
1,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
$ProcessObj_as_string = Dumper($ProcessObj);
# restore STDOUT
open(STDOUT, ">&", $STDOUT_ORIG) or die;
while( )
{
chomp($_);
$Q->enqueue( $_ );
}
close( CHILD_PROC );
}
threads->new( \&work )->detach;
use Tk;
use Tk::ProgressBar;
my $mw = MainWindow->new;
my $pb = $mw->ProgressBar()->pack();
my $repeat;
$repeat = $mw->repeat( 100 => sub {
while( $Q->pending ) {
my $progress = $Q->dequeue;
return unless $progress;
$repeat->cancel if $progress == 100;
$pb->value( $progress );
}
} );
$mw->Button('-text' => 'Cancel',
'-command' =>
sub
{
my $VAR1;
$ProcessObj = eval($ProcessObj_as_string);
$ProcessObj->Kill(0);
exit 0;
})->pack();
$mw->Button('-text' => 'Suspend',
'-command' =>
sub
{
my $VAR1;
$ProcessObj = eval($ProcessObj_as_string);
$ProcessObj->Suspend();
})->pack();
$mw->Button('-text' => 'Resume',
'-command' =>
sub
{
my $VAR1;
$ProcessObj = eval($ProcessObj_as_string);
$ProcessObj->Resume();
})->pack();
$mw->MainLoop;