From: Hidetoshi NAGAI Date: 2007-01-19T11:01:21+09:00 Subject: [ruby-dev:30147] Re: merge YARV 永井@知能.九工大です. From: SASADA Koichi Subject: [ruby-dev:30145] Re: merge YARV Date: Thu, 18 Jan 2007 13:43:42 +0900 Message-ID: <45AEFAE4.8040201@atdot.net> >  そういえば、rb_proc_new() は作りました。 ありがとうございます. >  tcl/tk がネイティブスレッドに対してどのような対処をしているのかよくわ > かっていないのですが、たとえばメッセージポンプ(あるのかしらん)と別ス > レッドで動いちゃうとまずい、ってことになりますでしょうか。 私も良く分かってはいなかったので ;;;^_^;;; 調べていたのですが, ・インタプリタはそれが作成されたネイティブスレッドに拘束され, 他のネイティブスレッドからのアクセスはできない. ・イベントキューはネイティブスレッドごとに個別に存在する. 処理対象にできるインタープリタは,同じネイティブスレッド上のもののみ. ・他のネイティブスレッド上のイベントキューにイベントを送ることは可能. というような感じです. というわけで,TclTkIp オブジェクトにスレッド情報を持たせるとか, イベントループの管理方法を変更しなければならないとか, Tcl/Tk インタープリタの関数を直接呼ぶようにしていた部分は すべて書き換えなければならないとか... まぁ,いろいろとやらなきゃいけないことが多そうです. シグナル処理についても何らかの対処が必要なように思うのですが, tcltklib.c 上のみでうまくごまかせることなのか, signal.c をいじる必要があることなのかを掌握できていません. ただ,Tk を require しなくてもスレッドが絡んだ際に シグナル処理の異常を生じることがあるようなので, signal.c もこのままではまずそうな気はしています. >  tk 使う人は、スレッドの使い方に注意しましょう、では難しい感じでしょうか。 ダメですね. 今のままでは require 'tk' を実行したスレッド以外で Tk を使おうとすると 全く動きませんから. 例えば require 'tk'; Thread.new{Tk.mainloop} はダメですし, require 'tk' l = TkLabel.new.pack Thread.new{ 10.times{|i| l.text = i; sleep 1} } Tk.mainloop のようなこともダメですので. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp