From: ARIMA Yasuhiro Date: 2000-03-29T22:22:40+09:00 Subject: [ruby-dev:9526] Re: timeout しない timeout 有馬です。 gotoken@math.sci.hokudai.ac.jp (GOTO Kentaro) wrote | sec を yield に渡す必要は感じませんです。 そうですよね。nil or false に限定ですし。 return の結果も評価できないなら return true も不要ですかねぇ。 def timeout(sec) return yield unless sec begin x = Thread.current y = Thread.start { sleep sec x.raise TimeoutError, "execution expired" if x.status } yield ensure Thread.kill y if y.status end end 結果を返すなら、タイムアウトせずに終えたかどうかを返すのでしょうね。 def complete?(sec) unless sec yield return true end begin x = Thread.current y = Thread.start { sleep sec x.raise TimeoutError if x.alive? } yield sec Thread.kill y if y.alive? return true rescue TimeoutError return false end end 例外を使わない方がわかりやすいかと思ったのですが、 あまり変わらない。 def complete?(sec) unless sec yield return true end ret = true x = Thread.start { yield } y = Thread.start { sleep sec Thread.kill x if x.alive? ret = false } x.join Thread.kill y if y.alive? return ret end -- 有馬 康弘