石橋秀仁です。

At Wed, 19 Jan 2000 10:52:06 +0900
  nagai / dumbo.ai.kyutech.ac.jp wrote:

> 永井@知能.九工大です.
> 
> s34204> > むむむ.
> s34204> > 作成された widget 自体は消滅させずに Tk.mainloop だけを止めたい
> s34204> > という理解でよろしいでしょうか?
> s34204> > # そうでないなら,インタープリタを一度完全に殺してしまって,
> s34204> > # 再表示時にインタープリタの再生成を行うというので良さそうです.
> s34204> リクエストは,「下」の完全に消去するほうです。
> s34204> 「上」のほうが高級な感じがしますが,
> s34204> ぼくはそこまで高級な機能が欲しくなったことは無いです。
> s34204> それに,現状でも実現できますから,さしあたっては必要無いかと。
> 
> Tk.mainloop だけの停止って,本当にうまく実現できてます?
> 例えば,一つのスレッドで Tk.mainloop をやってて,
> そのスレッドを殺せば確かに widget の反応も止まります.
> ですが,その間の処理待ちイベントが溜ってしまって,
> 次に Tk.mainloop を動かした際に一気に処理されてしまったりしませんか?
> これは期待に反するものだと思うのですが...

おっしゃる通りです。ちょっと勘違いしていました。
「現状で実現できる機能」は,
「作成されたwidgetを消滅させずにTk.mainloopだけを止める」ではなく,
「復元情報を保持してTk.mainloopをまるごと消滅させる」です。
要するに,「お待ち下さい」を表示する代わりに,
root windowからまるごと消してしまうってことですね。

そして,「Tk.mainloopだけの停止」をやってみると,
確かにイベントの洪水によるダム決壊状態となったのを覚えています。

---
ところで,Ruby/Tkの制御構造はイベント駆動なのに,
なぜ,あたかもポーリングをしているように,
Tk.mainloopのスレッドがリソースの大食いをするのか,
疑問に思っていました。

OSのスレッドライブラリを使えば,ダイアログを出しながら裏で計算する,
というマルチスレッド処理が,スマートに実現できますよね。
つまり,イベント待ちはスレッドの実行権の放棄になると思います。
# Windows95ならDispatchMessageとかなんとか。

でも,Ruby/Tkの使用感は,まるでポーリングをしているように重いのです。
これは,Rubyのスレッドで実現する以上は仕方の無いことなのでしょうか?
あるいは,設計上の考慮で改善できるのでしょうか?

Hideto ISHIBASHI
http://vip.cis.kurume-nct.ac.jp/~s34204/