Is there any better way in Ruby to sleep until some condition is true ?
loop do
sleep(1)
if ready_to_go
break
end
end
You can use the waitutil
gem as described at http://rubytools.github.io/waitutil/, e.g.
require 'waitutil'
WaitUtil.wait_for_condition("my_event to happen",
:timeout_sec => 30,
:delay_sec => 0.5) do
check_if_my_event_happened
end
I like this form since it is simple and only uses sleep if needed after it tests for the done condition:
begin
ready_to_go = do_some_action
end until ready_to_go or not sleep 1
until
can be a statement modifier, leading to:
sleep(1) until ready_to_go
You'll have to use that in a thread with another thread changing ready_to_go
otherwise you'll hang.
while (!ready_to_go)
sleep(1)
end
is similar to that but, again, you'd need something to toggle ready_to_go
or you'd hang.
You could use:
until (ready_to_go)
sleep(1)
end
but I've never been comfortable using until
like that. Actually I almost never use it, preferring the equivalent (!ready_to_go)
.
def sleep_until(time)
time.times do
break if block_given? && yield
sleep(1)
end
end
Usage:
sleep_until(18){till_i_die}