From: Hidetoshi NAGAI Date: 2008-07-05T06:53:32+09:00 Subject: [ruby-list:45193] Re: ソース:インストール:MacOSX10.3.9 永井@知能.九工大です. From: wei Subject: [ruby-list:45192] Re: ソース:インストール:MacOSX10.3.9 Date: Sat, 5 Jul 2008 02:08:28 +0900 Message-ID: <064AC426-C05D-4454-9F23-56ACB1F9CCC7@gmail.com> > 以下の環境で試しました。 > > MacOSX 10.5.4 (intel mac) > Tcl/Tk 8.5.3 > ruby 1.9.0-2 テストをありがとうございます. > tcltklib.cのpatchをあててビルド [ruby-list:45146] の tcltklib.c の patch は 効果がないということですので,これは必要ありませんでした. 余計なお手間を取らせてしまい,すみません. > この状態で > ext/tk/sample/demos-jp/widget > を実行すると、天野さんの報告にあった、以下のエラーが出力され > ました。 > > % ruby widget > Tk_MacOSXSetupTkNotifier: first [load] of TkAqua has to occur in the > main thread! > Abort > % > > Tcl/Tkを手動でインストールする前は問題なく起動しております。 > つまり手動でインストールした事により、該当の現象が > Intel Macでも起きました。 もしかして,手動インストールした Tcl/Tk は Aqua 版で, 以前から入っていたものは X Window System 版だったりしませんか? そうであるなら, > という事で、永井さんのメールにあった、 > module TkCore; RUN_EVENTLOOP_ON_MAIN_THREAD = true; end > require 'tk' > というようにrequireの前に持って来て実行した所、無事に起 > 動しました。 > > という事で、 > ・Intel MacでもTcl/Tkによっては問題の現象が起きる > ・問題の現象が起きてもmain threadで実行すれば解決する > (少くてもIntel Macでは) > となりそうです。 ということから,Aqua 版の known bug として, 「Aqua 版の Tcl/Tk ライブラリを Ruby1.9 で用いる場合には, イベントループ (Tk.mainloop) はメインスレッドでしか実行できません」 ということにする必要がありそうです. ただ,エラーメッセージ "first [load] of TkAqua" の "first" が 気になっているんですよね. これがために [ruby-list:45146] の tcltklib.c の patch を 試してみていただいたのですが,ダメだったわけです. 今,思いついたテストとしては, ダミーの Tcl/Tk インタープリタを生成してすぐに終了させることで, 無理やりに一度は TkAqua を main thread で読み込んでみる というのがあります. つまりは --------------------------------------------------------- require 'tcltklib' ip = TclTkIp.new ip._eval('after 1 {destroy .}') TclTkLib.mainloop ip.delete ip = nil # for GC require 'tk' --------------------------------------------------------- などとしてみるという話です. まぁ,まず間違いなくダメだとは思いますが...(^_^; -- 永井 秀利 (nagai@ai.kyutech.ac.jp) 九州工業大学 大学院情報工学研究院 知能情報工学研究系