Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Setting a timer to a system call

by zentara (Archbishop)
on Aug 15, 2012 at 15:38 UTC ( #987573=note: print w/ replies, xml ) Need Help??


in reply to Setting a timer to a system call

Re: how can I detach a thread from another or how can I set a timer for a thread? shows a simplified way of using a timer thread. Also remember, that if the timer thread calls "exit", all threads die. The timer can quickly kill the parent thread just by calling "exit" on itself. There are other versions of this out there, google for "perl timer thread".


I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh


Comment on Re: Setting a timer to a system call
Re^2: Setting a timer to a system call
by Freezer (Sexton) on Aug 16, 2012 at 09:13 UTC
    I think that this code you link to looks interesting. However, oh so complicated. Is it worth reflecting on how other languages might handle this problem, as it seems that a new Perl command could be in order?
      It dosn't get much simpler than this. Instead of the SIG(INT), you could just directly call exit, for a quicker kill.
      #!/usr/bin/perl -w use strict; use threads; use threads::shared; my $timer_go:shared = 0; my $worker = threads->create(\&worker); my $timer = threads->create(\&timer,$worker); print "hit enter to start\n"; <>; $timer_go=1; <>; $timer->join(); $worker->join(); sub timer { my $worker = shift; while(1){ if($timer_go){ my $count = 0; while(1){ $count++; if($count > 5){ print "timed out\nHit enter to finish\n"; # Send a signal to a thread $worker->kill('INT'); return; } sleep 1; print "timing $count\n"; } }else{sleep 1} } } sub worker { $|++; $SIG{INT} = sub{ warn "Caught Zap!\n"; sleep 1; exit; }; # do your timed program here. my $worker_pid = open( READ, "top -d 1 -b |" ); print "\t$worker_pid\n"; while(<READ>){ } return; }

      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh
        Global symbol "$timer_go" requires explicit package name
        I presume that message is to be expected.
        system ($call); # This is where my system call is my $worker_pid = open( READ, "top -d 1 -b |" ); # What does this + line mean? print "\t$worker_pid\n"; while(<READ>){ } return; }
        My question is embedded in the code. Thanks.
        I can get this program to go through the cycle once. However it will not go through the cycle more than once when the subroutines are activated from within a loop. Can this problem be easily fixed and can the reasons why be quickly explained?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://987573]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (5)
As of 2014-09-21 21:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (176 votes), past polls