[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 を組み合わせて
実現した経験もあります。

以上、ご参考になれば。

In This Thread