Timers and Alarms

H

Hans Fugal

I want a program to wait for some moment in time, and resume operation
at that moment. sleep is ruled out because it just counts cycles and is
thrown off when my laptop suspends.

In C I'd use a one-fire timer, using setitimer. But in some quick
googling it looks like the ruby interpreter may use setitimer internally
for thread scheduling. Is there a safe way in ruby to sleep until a real
moment in time?
 
E

Eric I.

I want a program to wait for some moment in time, and resume operation
at that moment. sleep is ruled out because it just counts cycles and is
thrown off when my laptop suspends.

What about a roll-your-own solution like:

def my_sleep(interval, granularity = 60)
end_time = Time.now + interval

remaining = end_time - Time.now
while granularity < remaining
sleep granularity
remaining = end_time - Time.now
end

sleep remaining
end

Even if you close your laptop, when you finally wake it, the timer
will end within granularity seconds.

Eric
 
H

Hans Fugal

What about a roll-your-own solution like:

def my_sleep(interval, granularity = 60)
end_time = Time.now + interval

remaining = end_time - Time.now
while granularity < remaining
sleep granularity
remaining = end_time - Time.now
end

sleep remaining
end

It's going to have to be something like this I think. I don't know how
much impact waking every so often (about once per second in my
situation) will have on power usage, but I see now that even setitimer
in C suffers the same problem sleep does with laptop suspend.
 
E

Eric I.

It's going to have to be something like this I think. I don't know how
much impact waking every so often (about once per second in my
situation) will have on power usage, but I see now that even setitimer
in C suffers the same problem sleep does with laptop suspend.

Looking at my code, it may be best to change the next-to-last line to:

sleep remaining if remaining > 0

Which OS are you using? On OS X the man page for setitimer claims
there are three separate timers, one of which uses real time. From
the man page:

The ITIMER_REAL timer decrements in real time. A SIGALRM signal
is
delivered when this timer expires.

I don't have any experience with using this, so I'm left with the man
page.

Eric
 
H

Hans Fugal

Eric said:
Looking at my code, it may be best to change the next-to-last line to:

sleep remaining if remaining > 0

Which OS are you using? On OS X the man page for setitimer claims
there are three separate timers, one of which uses real time. From
the man page:

The ITIMER_REAL timer decrements in real time. A SIGALRM signal
is
delivered when this timer expires.

I don't have any experience with using this, so I'm left with the man
page.

OS X, and experimentation verifies the same behavior as sleep. It's
probably the same in Linux, but I don't have a linux laptop to try it with.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,536
Members
45,020
Latest member
GenesisGai

Latest Threads

Top