[ruby-gnome2-devel-ja] =?iso-2022-jp?b?bGliZ2xhZGUyGyRCJE4bKEI=?=
=?iso-2022-jp?b?GyRCJVElQyVBGyhC?=
From: Masao M. <mu...@hi...> - 2006-10-12 16:36:08
|
須藤さん むとうです。 いつもバグ修正、ありがとうございます。 1点確認させてください。 今日、libglade2.rbに当てられたパッチですが、 これの意図についてです。 @sources ||= {} @sources[source.object_id] = source source.signal_connect("destroy") do |object| @sources.delete(object.object_id) end この部分だけみると、確かに問題の回避はできてると 思うのですが、これって要は 1. グローバル(といってもGladeXMLクラスの内部)な領域に ウィジェットを保持。GCを避ける 2. destroyイベントのタイミングでオブジェクトを削除。 その後、GC対象となる ということをしてるんですよね。 これって、libglade2だけの問題ですか? ぱっと見たところ、GLib::Objectのインスタンスなら全てが 該当しそうな気がしたので質問させて頂きました。 ではでは。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2006-10-13 00:56:00
|
須藤です. 06/10/13 に Masao Mutoh<mu...@hi...> さんは書きました: > 今日、libglade2.rbに当てられたパッチですが、 > これの意図についてです。 > > @sources ||= {} > @sources[source.object_id] = source > source.signal_connect("destroy") do |object| > @sources.delete(object.object_id) > end > > この部分だけみると、確かに問題の回避はできてると > 思うのですが、これって要は > > 1. グローバル(といってもGladeXMLクラスの内部)な領域に > ウィジェットを保持。GCを避ける > 2. destroyイベントのタイミングでオブジェクトを削除。 > その後、GC対象となる > > ということをしてるんですよね。 はい,そうです. > これって、libglade2だけの問題ですか? だと思います. > ぱっと見たところ、GLib::Objectのインスタンスなら全てが > 該当しそうな気がしたので質問させて頂きました。 GLib::Objectだと(たぶん)プロパティ内のオブジェクトが全て マークされるのでGCされません.(さかいさんがこういうことを やってくれたのだと思っています.) しかし,GladeXMLはプロパティとして.gladeから作られたウィ ジェットをもっていないので,↑の仕組みではGCから保護されま せん.ということで,明示的にオブジェクトの参照を持っておい てGCから保護するようにしました。 本当は.glade内にあるトップレベルの全てのウィジェットを持てば よいと思いますが,そういうAPIが公開されていないようだったの で,必要最小限ということで,signal_connectされたオブジェクト だけ参照を持っておくようにしました. |
From: Masao M. <mu...@hi...> - 2006-10-13 17:36:22
|
むとうです。 On Fri, 13 Oct 2006 09:55:58 +0900 "Kouhei Sutou" <ko...@co...> wrote: > 須藤です. > > 06/10/13 に Masao Mutoh<mu...@hi...> さんは書きました: > > > 今日、libglade2.rbに当てられたパッチですが、 > > これの意図についてです。 > > > > @sources ||= {} > > @sources[source.object_id] = source > > source.signal_connect("destroy") do |object| > > @sources.delete(object.object_id) > > end > > > > この部分だけみると、確かに問題の回避はできてると > > 思うのですが、これって要は > > > > 1. グローバル(といってもGladeXMLクラスの内部)な領域に > > ウィジェットを保持。GCを避ける > > 2. destroyイベントのタイミングでオブジェクトを削除。 > > その後、GC対象となる > > > > ということをしてるんですよね。 > > はい,そうです. > > > これって、libglade2だけの問題ですか? > > だと思います. > > > ぱっと見たところ、GLib::Objectのインスタンスなら全てが > > 該当しそうな気がしたので質問させて頂きました。 > > GLib::Objectだと(たぶん)プロパティ内のオブジェクトが全て > マークされるのでGCされません.(さかいさんがこういうことを > やってくれたのだと思っています.) > > しかし,GladeXMLはプロパティとして.gladeから作られたウィ > ジェットをもっていないので,↑の仕組みではGCから保護されま > せん.ということで,明示的にオブジェクトの参照を持っておい > てGCから保護するようにしました。 なるほど・・・。 ちなみにGladeXMLオブジェクト自体が先に解放されても大丈夫でしょうか? > 本当は.glade内にあるトップレベルの全てのウィジェットを持てば > よいと思いますが,そういうAPIが公開されていないようだったの > で,必要最小限ということで,signal_connectされたオブジェクト > だけ参照を持っておくようにしました. GladeXML#widget_namesでウィジェット名が取れるので、 @glade.widget_names.each do |name| @source[name] << @glade[name] end みたいな感じでしたらいけるかも・・・。 あ、でもトップレベルって訳じゃないか。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-10-14 12:24:28
|
むとうです。 On Sat, 14 Oct 2006 13:26:03 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 02:36:08 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > ちなみにGladeXMLオブジェクト自体が先に解放されても大丈夫でしょうか? > > こういうことでしょうか? > > glade = GladeXML.new(...) {...} > glade = nil > GC.start > > 大丈夫では無いです.クロージャもGCされます. なるほど・・・。 > 私はGladeのことはよくわからないのですが,GladeXMLはウィジェッ > トを作ったらすぐに開放するのが普通なのでしょうか? 普通はそんなことは無いですが、例えば複数のgladeファイルを1つのアプリケーション で使う場合など、可能性はあります。 > > > 本当は.glade内にあるトップレベルの全てのウィジェットを持てば > > > よいと思いますが,そういうAPIが公開されていないようだったの > > > で,必要最小限ということで,signal_connectされたオブジェクト > > > だけ参照を持っておくようにしました. > > > > GladeXML#widget_namesでウィジェット名が取れるので、 > > > > @glade.widget_names.each do |name| > > @source[name] << @glade[name] > > end > > > > みたいな感じでしたらいけるかも・・・。 > > あ、でもトップレベルって訳じゃないか。 > > トップレベルのウィジェットもとれるのでこれでもよいと思います. > が,手元で少し試した感じだと,トップレベルのウィジェットだけ > 参照してもだめな気がします. > > 例えば,こんなときにハンドラがGCされてしまいます. > > トップレベルのウィジェット -> ... -> ハンドラを設定しているウィジェット > 子 子 > > 「トップレベルのウィジェット」の参照だけを持っていても,間の > 「...」のところにRubyのウィジェットがまだ存在しない(ことも > ある)ため,プロパティを辿ってマークしていっても,「ハンドラ > を設定しているウィジェット」がGCされ,結果的にハンドラもGCさ > れてしまいます. > > widget_namesを使って一度全てのウィジェットを取り出せば,間の > 「...」にもRubyのウィジェットができるので↑のようなことは起 > きなくなります.ただ,なんかもったいない気はします. > > ということで,今の「ハンドラを設定したウィジェットの参照をもっ > ておく」作戦が妥当じゃないかと思います. なるほど。確かに。 > ところで,「ハンドラを設定しているウィジェット」の参照を保持 > する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ > か別の場所に持たせた方がよいでしょうか? 可能性という意味では、先の例があげられますので、 グローバルに持たせた方が良いような気がします。 ではでは。 -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-10-14 14:50:26
|
むとうです。 On Sat, 14 Oct 2006 23:06:39 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 21:24:19 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > > ところで,「ハンドラを設定しているウィジェット」の参照を保持 > > > する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ > > > か別の場所に持たせた方がよいでしょうか? > > > > 可能性という意味では、先の例があげられますので、 > > グローバルに持たせた方が良いような気がします。 > > 違うアイディアを思い付きました. > > --- libglade2.rb.~1.14.~ 2006-10-12 22:50:17.000000000 +0900 > +++ libglade2.rb 2006-10-14 22:59:00.000000000 +0900 > @@ -40,10 +40,9 @@ class GladeXML > end > > if signal_proc > - @sources ||= {} > - @sources[source.object_id] = source > - source.signal_connect("destroy") do |object| > - @sources.delete(object.object_id) > + parent = source.parent > + while parent > + parent = parent.parent > end > case signal_proc.arity > when 0 > > > Gtk::Window(とかGtk::Dialogとか)はdestroyされるまでGCされ > ない仕組みを利用します. おぉ。これは良い感じです! > パッチのように,ハンドラが設定されるウィジェットの親を辿りま > くって,全ての親ウィジェットのRubyのオブジェクトを作っておき > ます.一度作られたGtk::WidgetはGCされないで,さらに,ハンド > ラを設定したウィジェットを辿るまでのウィジェット用のRubyのオ > ブジェクトも存在するので,ハンドラが設定されるウィジェットは > (もし親にいれば)Gtk::WindowがGCされるまで生き続けます. > > で,これはGladeを使っていない普通のRuby/GTK+アプリケーション > と同じ動作になります. > > どうでしょうか? > > 念のため,例えば,親ウィジェットにGtk::Windowがいない場合, > のために,@sourcesにウィジェットを残しておく処理も残しておき > ますか? 確かに両方のパターンが考えられますので、両方とも採用しましょう。 ありがとうございます! -- .:% Masao Mutoh<mu...@hi...> |
From: Masao M. <mu...@hi...> - 2006-10-14 15:51:02
|
むとうです。 ありがとうございました。 ちなみに、 make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() #な、ながい・・・。 を、分割した理由はありますか? 再利用しないようでしたらguard_source_from_gc()の中に入れて しまった方が良いと思うのですが。 それから、 make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() の名称ですが、別だしにするならもう少し適切な名称にしませんか。 上記の訳は、 「ancestorsの中にウインドウを持つウィジェットの親ウィジェットたちを作る。」 という訳になると思いますが、それではそのメソッドを呼び出すために期待する機能 を表していないと思います。 正直、再利用性があまり見えないのですが、あえてそのメソッド名を表すのであれば 「そのウィジェットの親ウインドウを呼び出すことでそのウィジェットをGCから守る」 guard_source_from_gc_to_create_a_parent_window_as_a_ruby_object みたいな感じだと思います。 他には、 seek_a_parent_window_to_guard_the_widget_from_gc とかかな。 ただ、やっぱり分ける意味を感じないし他の人が見たら理解しづらいですよね。 再利用考えると(英文法は考えず) seek_parent_window(source) 位にして、親ウインドウを返すようなメソッドにした方が良いかも。 でも、逆にそれだと汎用的すぎて、あえてRuby/Libgladeに入れておく意味が 無いような気がしますね。Ruby/GTKにあると便利かもしれないけど。 Gtk::Widgetのメソッドとして、source.parent_windowってのにする、とか。 それから、さらに蛇足ですが、 make parent widgets for a widget のa widgetはthe widgetじゃないかなぁ、とか思ったりするのですが・・・。 引数のオブジェクトなんだからtheが正しいと思いますが、引数のことを考えず に機能を示すのならaということもあるかもしれないけど・・・ メソッド名にa/theを使ったことがないから、実はよくわかってませんが。 ではでは。 On Sun, 15 Oct 2006 00:06:58 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 23:50:10 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > > 違うアイディアを思い付きました. > > > > > > --- libglade2.rb.~1.14.~ 2006-10-12 22:50:17.000000000 +0900 > > > +++ libglade2.rb 2006-10-14 22:59:00.000000000 +0900 > > > @@ -40,10 +40,9 @@ class GladeXML > > > end > > > > > > if signal_proc > > > - @sources ||= {} > > > - @sources[source.object_id] = source > > > - source.signal_connect("destroy") do |object| > > > - @sources.delete(object.object_id) > > > + parent = source.parent > > > + while parent > > > + parent = parent.parent > > > end > > > case signal_proc.arity > > > when 0 > > > > 念のため,例えば,親ウィジェットにGtk::Windowがいない場合, > > > のために,@sourcesにウィジェットを残しておく処理も残しておき > > > ますか? > > > > 確かに両方のパターンが考えられますので、両方とも採用しましょう。 > > 両方有効にしてコミットしておきました. > > > ------------------------------------------------------------------------- > Using Tomcat but need to do more? Need to support web services, security? > Get stuff done quickly with pre-integrated technology to make your job easier > Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo > http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 > _______________________________________________ > ruby-gnome2-devel-ja mailing list > rub...@li... > https://lists.sourceforge.net/lists/listinfo/ruby-gnome2-devel-ja > -- -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2006-10-15 02:15:23
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sun, 15 Oct 2006 00:50:50 +0900, Masao Mutoh <mu...@hi...> wrote: > ちなみに、 > make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() > #な、ながい・・・。 > > を、分割した理由はありますか? 何をやっているのかをコメントとして書きたくなかったというのが 理由です.後で見たときに,どうして↓がGCのための処理なのかは わからないと思います. parent = source.parent while parent parent = parent.parent end 再利用のため,というのは全然考えていませんでした. > それから、 > make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() > の名称ですが、別だしにするならもう少し適切な名称にしませんか。 変な英語ですいません... > guard_source_from_gc_to_create_a_parent_window_as_a_ruby_object > seek_a_parent_window_to_guard_the_widget_from_gc 私はどちらでも構いません. > ただ、やっぱり分ける意味を感じないし他の人が見たら理解しづらいですよね。 わかりました. では,統合してしまってください. 余計な手間を増やしてすいませんでした. |
From: Masao M. <mu...@hi...> - 2006-10-15 07:43:38
|
むとうです。 On Sun, 15 Oct 2006 11:15:16 +0900 (JST) Kouhei Sutou <ko...@co...> wrote: > 須藤です. > > In <200...@hi...> > "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sun, 15 Oct 2006 00:50:50 +0900, > Masao Mutoh <mu...@hi...> wrote: > > > ちなみに、 > > make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() > > #な、ながい・・・。 > > > > を、分割した理由はありますか? > > 何をやっているのかをコメントとして書きたくなかったというのが > 理由です.後で見たときに,どうして↓がGCのための処理なのかは > わからないと思います. それは、コメントを残すべきでしょう。 再利用性が無い(かつ、他に特別な理由がない)のに、 コメントと同様のことをAPIで実現しようと言うのは本末転倒だと思います。 > > それから、 > > make_parent_widgets_for_a_widget_that_has_a_window_in_ancestors() > > の名称ですが、別だしにするならもう少し適切な名称にしませんか。 > > 変な英語ですいません... APIとして用意する以上、他から使われる前提で物事を考えるべきではないでしょうか。 コメントなら後から修正しても問題はないですが、APIの場合は仕様変更になりますし。 > > ただ、やっぱり分ける意味を感じないし他の人が見たら理解しづらいですよね。 > > わかりました. > では,統合してしまってください. 直しておきました。 -- .:% Masao Mutoh<mu...@hi...> |
From: Kouhei S. <ko...@co...> - 2006-10-14 15:07:11
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 23:50:10 +0900, Masao Mutoh <mu...@hi...> wrote: > > 違うアイディアを思い付きました. > > > > --- libglade2.rb.~1.14.~ 2006-10-12 22:50:17.000000000 +0900 > > +++ libglade2.rb 2006-10-14 22:59:00.000000000 +0900 > > @@ -40,10 +40,9 @@ class GladeXML > > end > > > > if signal_proc > > - @sources ||= {} > > - @sources[source.object_id] = source > > - source.signal_connect("destroy") do |object| > > - @sources.delete(object.object_id) > > + parent = source.parent > > + while parent > > + parent = parent.parent > > end > > case signal_proc.arity > > when 0 > > 念のため,例えば,親ウィジェットにGtk::Windowがいない場合, > > のために,@sourcesにウィジェットを残しておく処理も残しておき > > ますか? > > 確かに両方のパターンが考えられますので、両方とも採用しましょう。 両方有効にしてコミットしておきました. |
From: Kouhei S. <ko...@co...> - 2006-10-14 14:06:46
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 21:24:19 +0900, Masao Mutoh <mu...@hi...> wrote: > > ところで,「ハンドラを設定しているウィジェット」の参照を保持 > > する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ > > か別の場所に持たせた方がよいでしょうか? > > 可能性という意味では、先の例があげられますので、 > グローバルに持たせた方が良いような気がします。 違うアイディアを思い付きました. --- libglade2.rb.~1.14.~ 2006-10-12 22:50:17.000000000 +0900 +++ libglade2.rb 2006-10-14 22:59:00.000000000 +0900 @@ -40,10 +40,9 @@ class GladeXML end if signal_proc - @sources ||= {} - @sources[source.object_id] = source - source.signal_connect("destroy") do |object| - @sources.delete(object.object_id) + parent = source.parent + while parent + parent = parent.parent end case signal_proc.arity when 0 Gtk::Window(とかGtk::Dialogとか)はdestroyされるまでGCされ ない仕組みを利用します. パッチのように,ハンドラが設定されるウィジェットの親を辿りま くって,全ての親ウィジェットのRubyのオブジェクトを作っておき ます.一度作られたGtk::WidgetはGCされないで,さらに,ハンド ラを設定したウィジェットを辿るまでのウィジェット用のRubyのオ ブジェクトも存在するので,ハンドラが設定されるウィジェットは (もし親にいれば)Gtk::WindowがGCされるまで生き続けます. で,これはGladeを使っていない普通のRuby/GTK+アプリケーション と同じ動作になります. どうでしょうか? 念のため,例えば,親ウィジェットにGtk::Windowがいない場合, のために,@sourcesにウィジェットを残しておく処理も残しておき ますか? |
From: Kouhei S. <ko...@co...> - 2006-10-14 04:26:09
|
須藤です. In <200...@hi...> "Re: [ruby-gnome2-devel-ja] libglade2のパッチ" on Sat, 14 Oct 2006 02:36:08 +0900, Masao Mutoh <mu...@hi...> wrote: > ちなみにGladeXMLオブジェクト自体が先に解放されても大丈夫でしょうか? こういうことでしょうか? glade = GladeXML.new(...) {...} glade = nil GC.start 大丈夫では無いです.クロージャもGCされます. 私はGladeのことはよくわからないのですが,GladeXMLはウィジェッ トを作ったらすぐに開放するのが普通なのでしょうか? > > 本当は.glade内にあるトップレベルの全てのウィジェットを持てば > > よいと思いますが,そういうAPIが公開されていないようだったの > > で,必要最小限ということで,signal_connectされたオブジェクト > > だけ参照を持っておくようにしました. > > GladeXML#widget_namesでウィジェット名が取れるので、 > > @glade.widget_names.each do |name| > @source[name] << @glade[name] > end > > みたいな感じでしたらいけるかも・・・。 > あ、でもトップレベルって訳じゃないか。 トップレベルのウィジェットもとれるのでこれでもよいと思います. が,手元で少し試した感じだと,トップレベルのウィジェットだけ 参照してもだめな気がします. 例えば,こんなときにハンドラがGCされてしまいます. トップレベルのウィジェット -> ... -> ハンドラを設定しているウィジェット 子 子 「トップレベルのウィジェット」の参照だけを持っていても,間の 「...」のところにRubyのウィジェットがまだ存在しない(ことも ある)ため,プロパティを辿ってマークしていっても,「ハンドラ を設定しているウィジェット」がGCされ,結果的にハンドラもGCさ れてしまいます. widget_namesを使って一度全てのウィジェットを取り出せば,間の 「...」にもRubyのウィジェットができるので↑のようなことは起 きなくなります.ただ,なんかもったいない気はします. ということで,今の「ハンドラを設定したウィジェットの参照をもっ ておく」作戦が妥当じゃないかと思います. ところで,「ハンドラを設定しているウィジェット」の参照を保持 する場所ですが,GladeXMLオブジェクト内に持たせるよりも,どこ か別の場所に持たせた方がよいでしょうか? |