永井@知能.九工大です.

From: matz / netlab.co.jp (Yukihiro Matsumoto)
Subject: [ruby-list:20276] Re: Ruby/Tk multi interpreter
Date: Wed, 19 Jan 2000 14:24:45 +0900
Message-ID: <E12Anbn-0000B9-00 / ev.netlab.co.jp>
matz> Tclがスレッドと相性が悪いため(ローカル変数のアドレスを構造体
matz> に含めるなどというワザを使うんだもの)Tclのイベント処理などを
matz> 一手に引き受けるスレッドがポーリングのようなことをしているた
matz> めです。改善の余地はあるかもしれません。

Tcl/Tk の動作を完全に把握しているわけではないので確信は持てないんですが,
Tcl/Tk の動作って,
--------------------------------------------------------
・イベントが発生した時,
  イベント queue が空なら即実行.
  イベント queue に処理待ちのイベントが存在するなら
     新しいイベントを適当な待ち順に追加.

・( Tk_MainLoop() の処理 )
  root widget が存在する限り,Tcl_DoOneEvent を繰り返す.

・(Tcl_DoOneEvent() の処理 )
  イベント queue に処理待ちのイベントが存在するなら,そこから一つを実行
  存在しなければ,アイドル時に行うべき処理を実行
--------------------------------------------------------
ですよね?

現在は,Tk.mainloop などでは単に Tk_MainLoop を実行しているだけなんで,
代りに,スレッド切替えのタイミングなどに合わせつつ
Tcl_DoOneEvent() を適当に呼び出すようにすれば改善できるのかもしれません.

で,Tk.mainloop の停止なんですが,
Tcl_DoOneEvent() の呼び出しを完全に止めてしまうと
アイドル処理すら行われなくなるため,再描画が行われなくなります.
つまり,一旦後ろに隠れた window が再度表に出てきても,
隠れていた部分の描画がなされることがないということになります.
# ですよね? 今一つ自身がない (^_^;
問題はこれを是とするかどうかです.
Tcl_DoOneEvent() の呼び出しタイミングを Ruby 制御下に置き,
Tk.mainloop の停止時はアイドル処理以外の処理が行われないように
イベントをマスクするというのが自然に見える対応なのかもしれません.
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp