From: Masao M. <mu...@hi...> - 2006-05-17 14:28:22
|
むとうです。 先をこされてしまった(笑)。 さかいさん、ご無沙汰です。お元気でしょうか。 On Wed, 17 May 2006 23:18:21 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@to...> > "[ruby-gnome2-devel-ja] "warning: GRClosure invoking callback: already destroyed"" on Wed, 17 May 2006 23:01:59 +0900 (JST), > Masahiro Sakai (酒井政裕) <sa...@to...> wrote: > > > 最近のRuby/GLib2のコードはあまり真面目に読んでいないですが、 > > 多分以下のようなことが起きているのではないでしょうか。 > > 正解です. > > > b = Gtk::Button.new > > b.signal_connect('clicked'){ } > > > > # (中略) 「ボタンのgtk側オブジェクトはgtk側できちんと参照されているが、 > > # Ruby側のオブジェクトは(変数b以外からは)辿れない」という状態になる。(1) > > > > b = nil > > GC.start > > # ボタンのRuby側オブジェクトがGCされ、GRClosureHolderもGCされ、 > > # GRClosureのcountが0になる。 > > > > # その後ボタンがクリックされる。 > > # => "warning: GRClosure invoking callback: already destroyed" > > > > 現在のRuby-GNOME2は(1)のような状況が起らないようG_CHILD_ADD等で > > 頑張っているみたいですが、Ruby-GNOME2側でいくら頑張っても、 > > gtk側のコードでオブジェクトの参照関係が変化するような場合もあるので、 > > そのような状況を完全に排除するのは現実的ではないでしょう。 > > GTK+側でごにょごにょやっていても,G_CHILD_REMOVEが呼ばれない > 限りRuby側の参照がなくなりはしないので,リークはするかもしれ > ないですがRuby側のボタンがGCされることはない気がします. > > といっても,↑は適当に書いているので実際に酒井さんのいうケー > スがでるかもしれないです.私にはわからないです. 須藤さんもご指摘されているとおり、 少なくとも上記のRuby側による問題、については解決している・・・と思ってます。 きちんとGtk::Window等のウィンドウオブジェクトにaddされたウィジェットで あれば、b = nilされてもGCの対象にはなりません。 逆に、ウィンドウオブジェクトにaddされていないオブジェクトでこのエラーメッセージ が出るのはやむなし、だと思っています。その場合はユーザ側でGCされないような 工夫をすればよいかなと。 なので、おっしゃるとおり、gtk側による影響は確かにあるかもされませんですけど、 どうなんでしょう。通常に使ってる分には問題ないと思ってますが・・・。 #でも、そのケースって、RubyのオブジェクトがGCされていなくても #問題出そうな気もします。 -- .:% Masao Mutoh<mu...@hi...> |