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?

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

···

On Feb 21, 10:17 am, Hans Fugal <fug...@zianet.com> 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.

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

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.

···

On Feb 21, 8:42 am, "Eric I." <rubytrain...@gmail.com> wrote:

On Feb 21, 10:17 am, Hans Fugal <fug...@zianet.com> 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

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

···

On Feb 21, 12:57 pm, Hans Fugal <fug...@gmail.com> wrote:

On Feb 21, 8:42 am, "Eric I." <rubytrain...@gmail.com> wrote:

> 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.

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

Eric I. wrote:

···

On Feb 21, 12:57 pm, Hans Fugal <fug...@gmail.com> wrote:

On Feb 21, 8:42 am, "Eric I." <rubytrain...@gmail.com> wrote:

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.

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.