1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
class ThreadRunner
attr_reader :status, :thread_status
TIME_DELTA = 0.1
def initialize(timeout=0.25, &block)
@timeout = timeout
@status = nil
@thread = Thread.new do
@status = :started
yield self
@status = :finished
end
@monitor = Thread.new do
Thread.pass until @status == :started
time = 0
while time < @timeout
sleep TIME_DELTA
break unless @thread.alive?
time += TIME_DELTA
end
@thread_status = @thread.status
if @thread.alive?
@thread.kill
@status = :killed
end
@thread.join
end
@monitor.join
end
end
|