Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

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

Replies are listed 'Best First'.
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.
        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?
        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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://987573]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (9)
As of 2018-04-20 15:09 GMT
Find Nodes?
    Voting Booth?