Timers and Alarms

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?

On Feb 21, 10:17 am, Hans F. [email protected] wrote:

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

Are you interested in on-site Ruby training that uses well-designed,
real-world, hands-on exercises? http://LearnRuby.com

On Feb 21, 12:57 pm, Hans Fugal [email protected] wrote:

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.

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

Are you interested in on-site Ruby training that’s been highly
reviewed by former students? http://LearnRuby.com

Eric I. wrote:

end

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.

On Feb 21, 8:42 am, “Eric I.” [email protected] wrote:

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.