use strict; use Win32::API; use threads; my $hProcess = getCurrentProcess(); my $startmem=getProcessMemoryInfo($hProcess); for(my $x=0;$x<25;$x++){ select(undef,undef,undef,.1); #my $ctime=time(); threads->new(\&threadTest); } print STDOUT "OUT OF THREAD LOOP\n"; my $midmem=getProcessMemoryInfo($hProcess); #Wait for a bit and then clean up print STDOUT "Waiting 5 seconds\n"; select(undef,undef,undef,5); print STDOUT "CLEANING UP THREADS\n"; foreach my $thr (threads->list) { # Don't join the main thread or ourselves if ($thr->tid && !threads::equal($thr, threads->self)) { $thr->join; } } print STDOUT "Waiting 5 seconds\n"; select(undef,undef,undef,5); print STDOUT "Checking Memory\n"; my $endmem=getProcessMemoryInfo($hProcess); print "-"x30,"\n"; print "hprocess: $hProcess\n"; print "StartMem: $startmem MB\n"; print "MidMem: $midmem MB\n"; print "EndMem: $endmem MB\n"; exit; sub threadTest{ my $wtime=int(rand(5)) || .5; select(undef,undef,undef,$wtime); my $tid=threads->tid; print STDOUT "Thread $tid waited $wtime seconds\n"; } ############### sub getCurrentProcess{ my $GetCurrentProcess = new Win32::API("Kernel32", "GetCurrentProcess", [], 'N') || return $^E; my $hProcess=$GetCurrentProcess->Call(); return $hProcess; } ############### sub getProcessMemoryInfo { #usage: $memusage=getProcessMemoryInfo($hprocess); or ($memusage,$peakmemusage,$vmsize)=getProcessMemoryInfo($hprocess); my $hProcess=shift || return; my $name=shift; my $pid=shift; # memory usage is bundled up in ProcessMemoryCounters structure # populated by GetProcessMemoryInfo() win32 call my $DWORD = 'B32'; # 32 bits my $SIZE_T = 'I'; # unsigned integer # build a buffer structure to populate my $pmem_struct = "$DWORD" x 2 . "$SIZE_T" x 8; my $pProcessMemoryCounters = pack($pmem_struct, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); # GetProcessMemoryInfo is in "psapi.dll" my $GetProcessMemoryInfo = new Win32::API('psapi','GetProcessMemoryInfo', ['I', 'P', 'I'], 'I') || return $^E; my $DWORD_SIZE = 4; my $BufSize = 10 * $DWORD_SIZE; my $MemStruct = pack( "L10", ( $BufSize, split( "", 0 x 9 ) ) ); if( $GetProcessMemoryInfo->Call( $hProcess, $MemStruct, $BufSize ) ){ my( @MemStats ) = unpack( "L10", $MemStruct ); my $memusage=int($MemStats[3]/1024); my $peak_memusage=int($MemStats[2]/1024); my $vmsize=int($MemStats[8]/1024); if(wantarray){return ($memusage,$peak_memusage,$vmsize);} return $memusage; } return; }