Of course, being non-preemptive, this doesn't guarantee you'll get control back within a certain time, if the loop iteration takes to long, or the process blocks (e.g. waiting for user input).#! /usr/local/bin/perl -w use strict; { my $timesup = undef; sub timeout { if (@_) { # set the time to timeout on $timesup = time() + shift; } else { # return true as soon as we go over the limit return time() > $timesup; } } } # Programs code here timeout(10); # set to timeout in 10 seconds. my $timedout = 0; for (1..15) { # check if we can continue # If not, set flag to check later $timedout++ && last if timeout(); print "Do complicated thing, iter $_\n"; sleep(1); # pretend to do hard stuff } if ($timedout) { print "operation timedout\n"; } else { print "Success, complicated stuff completed\n"; }
Also assumes that other functions like alarm() aren't implemented, since these would be more robust, but the above is lightweight and may do what you need.
Update: I meant nonpre-emptive.
--
Brovnik
In reply to Re: Win32: timing out a perl subroutine
by Brovnik
in thread Win32: timing out a perl subroutine
by osfameron
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |