[ruby-list:50601] Re: Fwd: Re: Re: [質問]thread内sleepコール 他threadよりsleep状態からrun状態にされた際、指定時間sleepさせるには?
From:
dogatana <dogatana@...>
Date:
2017-10-11 03:45:25 UTC
List:
ruby-list #50601
# 返信が ruby-list でないのは使用しているメーラの問題のようです。
# 個別でも返信していますが、ご容赦を>山口さん
こんにちは、市田です。
rubyらしいかどうかは別として、自分ならという点をいくつか。
On 2017/10/04 16:18, yamataka@u08.itscom.net wrote:
> # sd: state diagram
> sd = [
> # ets etc call
> [{:run => :pause}, :exec_pause],
> [{:run => :run }, :exec_nil],
> [{:pause => :pause}, :exec_nil],
> [{:pause => :run }, :exec_run]
> ]
>
これを each で回してますが、せっかくリテラルで定義するなら
# 定義
sd = {
run: { pause: :exec_puase },
pause: { run: :exec_run },
}
# 関数選択
func = nil
func = sd[ets][etc] if sd[ets]
if func
send(func)
else
exec_nil
end
として、ループは避けます。
状態遷移表は基本二次元配列になるので、それをHashで実現という形です。
> ret = STDIN.gets
>
> case ret
> when /^ *q *$/
> puts "get q"
> exit
ここは私なら
ret = STDIN.gets.strip
case ret
when 'q'
#
when 'p'
#
end
と書きますかね。
処理内容として、when にそれぞれ正規表現を指定するのは、なんとなくコスト
が高い印象があるので。
あと、気になったのは exec_* を実行中、メインスレッドからの操作を行わない
点でしょうか。
最も Ruby のスレッドは他の言語のスレッドとは異なるようなので、全くの
並行処理はできないと、(どこかで)読んだ気がします。
作りの問題もあったのでしょうが、Tk で UIスレッドとメインスレッドを分離
したかったのですがうまく行かず、結局 Winform と rubygem を組み合わせて
実現した経験もあります。
以上、ご参考になれば。