永井@知能.九工大です. rom: Ryutaro Amano <wn9r-amn / asahi-net.or.jp> Subject: [ruby-list:45184] Re: ソース:インストール:MacOSX10.3.9 Date: Thu, 3 Jul 2008 20:01:06 +0900 Message-ID: <BBDF25D8-9635-489B-AE43-774900126281 / asahi-net.or.jp> > 天野です。RES遅くなり申し訳ありません。 お世話になってます. > > README.tcltklib の末尾あたりにある --enable-tcl-thread を > > configure オプションに追加して,threaded であることを > > 明示してやると > > どうなるでしょうか. > > 確かにpthreadへのwarningはなくなりますが、やはり > 同じエラーです。 (snip) > パッケージ作者のDaniel A. Steffenさんは、既に10.3.9 > の走るマシンを持ってないそうです。 早い話,この点については Ruby/Tk 側には責任はないということで 良いのでしょうね. # pthread 認識の失敗については,tclConfig ファイルの内容と # 現実のライブラリとに不整合があるのかもしれません. > 10.3.9の方はtcltkをソースからインストールすると問題ない > 訳ですが、10.5のほうの > 1.9.0-2と組み合わせた際の > > Tk_MacOSXSetupTkNotifier: first [load] of TkAqua has to occur in the > main thread! > Abort trap > > これはソースからインストールしても同じなので、何とかなると嬉 > しいのですが。 このエラーは tkMacOSXNotify.c の Tk_MacOSXSetupTkNotifier で 出ているのですが,コメントによると eventloop thread は アプリケーションの main native thread で動かさないと ならないということのようなので困っています. ご存じの通り,Ruby 1.9 では thread ごとに native thread が 生成されます. Tk の eventloop は,Tcl/Tk インタープリタを初期化した native thread 上でしかまともにはきませんから, Ruby 1.9 では新しく thread を生成して その中でインタープリタの生成および eventloop の稼働を 行うようにしています. で,Tk.mainloop はこの thread を監視するような形にすることで Thread.new{Tk.mainloop} としても大丈夫なように対策し, Ruby 1.8 との互換性を維持しています. ところが,MacOS X (Carbon) では,eventloop を main thread で動かさない限りは動作しないということになると, この方法が使えないということになるわけです. かといって main thread を勝手に乗っ取るわけにもいかないので, 「はてさてどうすべきか...」という状況です. Tk.mainloop を main thread で実行しさえすれば問題は出ず, かつ,アプリケーションの最後で Tk.mainloop を実行するような コーディングで構わないということであれば, 「そんなときのために」の機能をすでに組み入れてはいます. もし試してみていただけるなら, ---------------------------------------------------------- module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = true; end require 'tk' ---------------------------------------------------------- というように,'tk' を require する前に 定数を宣言していただけないでしょうか. これをやれば,Ruby 1.8 と同様に, インタープリタ生成に際して thread を作って eventloop まで起動しておくというのはしなくなります. その代り,main thread 以外で Tk.mainloop を動かしても 全く機能しないはずです. 試してみていただいた結果,これであれば動くということであれば, 応急処置的に MacOS X (Carbon) では RUN_EVENTLOOP_ON_MAIN_THREAD を true としてしまうことは可能かと思います. 制約はあるわけですが,全く動かないよりはマシですので. # 「応急処置的に」とは言ってますが, # 仕組みに対しての理解が正しければ, # 解消できるかどうかは甚だ疑問です. intel Mac と PowerPC Mac とでは違うという話もあるようですし, 正直なところ,テスト環境のない私ではすべてに確信が持てません. MacOS X 10.5 + Ruby 1.9.0-2 + Tcl/Tk 8.5 というような環境での テストが可能な方がいらっしゃいましたら, テスト結果を教えていただけますと助かります. ただ,残念ながら「報告いただければ解決します」とは言えないのが 現実であり,申し訳なくもあるのですが... -- 永井 秀利 (nagai / ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系