use strict;
use warnings;
use Win32::Process;
use Win32::IPC 'wait_any';
use Win32;
use threads;
my @progs = (
'C:\windows\system32\calc.exe',
'C:\windows\system32\notepad.exe',
);
my @proclist;
my %proctable;
for (@progs) {
my $ProcessObj;
Win32::Process::Create($ProcessObj,
$_,
"",
0,
NORMAL_PRIORITY_CLASS,
".")|| die ErrorReport();
$proctable{$ProcessObj->GetProcessID}{progname} = $_;
print "process created for $_\n";
push @proclist, $ProcessObj;
};
$| = 1;
sub ErrorReport{
print Win32::FormatMessage( Win32::GetLastError() );
}
sub wait_procs {
while (@proclist) {
my $x = wait_any(@proclist, INFINITE);
if ($x) {
my $proc = splice(@proclist, abs($x) - 1, 1);
my $id = $proc->GetProcessID;
my $program = $proctable{$id}{progname};
print "process finished x=$x id=$id program=$program\n";
}
}
print "thread exit\n";
}
my $thr = threads->create('wait_procs');
print "waiting for input\n";
$_ = <>;
print "input is $_\n";
$thr->join;
|