From: Hidetoshi NAGAI Date: 2005-02-08T17:51:06+09:00 Subject: [ruby-dev:25659] Re: some problems on ext/tk/sample/**/*.rb 永井@知能.九工大です. From: H.Yamamoto Subject: [ruby-dev:25656] Re: some problems on ext/tk/sample/**/*.rb Date: Tue, 8 Feb 2005 15:37:00 +0900 Message-ID: <20050208153646.6DDB8540.ocean@m2.ccsnet.ne.jp> > を ext/tk/tkutil/extconf.rb として作成し、 > 試した限りでは落ちなくなったようです。ただ、multi-ip の > サンプルがうまく動いていないようでした。 multi-tk は色々とややこしいことをしているので まだ問題の見落としがあるのでしょうねぇ... もう一度調べ直します. > ////////////////////////////////////////////////////////////////////////// > > require 'tk' > > menu_spec = [ > [['File', 0], > ['exit(Crash)', proc{exit}, 0]] > ] > > TkMenubar.new(nil, menu_spec).pack > Tk.mainloop > > でメニューから終了すると、画面中央に一瞬何かのウィンドウが表示される > ことがあります。すぐ閉じるので、なんて書いてあるのかは読めません。 > > #if 0 /* REMOVE : fail to rescue SystemExit */ > /* Tcl_Eval(interp, "destroy ."); */ > if (Tk_GetNumMainWindows() > 0) { > Tk_Window main_win = Tk_MainWindow(interp); > if (main_win != (Tk_Window)NULL) { > Tk_DestroyWindow(main_win); > } > } > #endif > > を復活させると、表示されなくなりました。 あぁ,そうかぁ.... Ruby 側の終了処理と Tk 側での終了処理とのタイミングの問題ですね. 問題の個所を復活させると,SystemExit が発生するやいなや mainwindow を消去するので余計なメッセージを出さないわけですが, SystemExit を rescue できなくなってしまいます. # rescue しようとしても,捕捉した時点では既に mainwindow が # 失われているので継続は無意味になる. この点も SEGV 問題に関わっていそうですね.対策を考えます. > ですが、落ちる原因がコマンド置換になかったので、 > > Tcl_Eval(ptr->ip, "foreach id [after info] {after cancel $id}"); > > に戻してもいいんじゃないかと思います。(こういうリファクタリングは大好きです) 確かにそうですね.戻すことにします. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp