From: Masao M. <mu...@hi...> - 2006-06-14 16:26:38
|
むとうです。 On Wed, 14 Jun 2006 17:03:03 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > 06/06/14 に 酒井政裕 Masahiro Sakai<sa...@to...> さんは書きました: > > > このコードについては、Gtk.timeout_add で登録したブロックを呼び出す > > gtk_m_functionがrb_protectを使っていないのがまずいので、 > > それを修正すれば良いと思います。 > > はい,それはわかります. > ただ,どう修正すればよいのかがわかりません.単にrb_protect() > して例外をあげないようにすると,↓の例でも例外があがらないよ > うになり,今までの動作とことなることになります. これなのですが、まぁ、今までの動作は置いておいて、 さかいさんのおっしゃるとおり、rb_protect()していない gtk_m_functionのバグで、そちらを修正した方が良さそうです。 過去の議論でもありましたが、以下のような整理になると思います。 1. Gtkのイベントループに登録したRubyのブロックがどこかで例外を発生した場合、 それをブロック内で処理(捕捉)しないでコケルのはアプリの不具合 2. 実際に捕捉していない例外が発生した場合、与えられたRubyのブロックの外側で例外 を捕捉し、Rubyが出してるっぽいエラーメッセージをRuby/GLib2がかわりに出す #ここまですればエラーの原因を開発者が発見できる・・・はず。 例えば、signal_connectで発生された例外を捕捉するのはどこか?というと どこで捕捉して良いのか定かではない(Gtk.mainをbegin/rescueで囲むのもカッコ悪いし signal_connectメソッドの周囲を囲むのも変)のでやはりブロックの中で閉じる、 というのがベターかと思います。 で、実際に、signal周りはこのような実装になっています。 #もちろん、実装したのはさかいさんです、念のため(笑)。 rbgobj_closure.cのrclosure_marshal_do()を参考にしてみてください。 それから実際にsignal_connectを使ったサンプルを添付しますね。timeout_addのとき とは違う動作をすることが確認できると思います。 #gtk_m_functionの方を修正してからお見せしようと思ったのですが、 #ちょっと今日は時間切れです・・・。すみません。 もちろん、完全にsegfaulをなくす方法があると良いんですが・・・。 ではでは。 -- .:% Masao Mutoh<mu...@hi...> |