[ruby-dev:24207] ruby/tk で、Tk.after の後もコールバックが解放されない

From: "H.Yamamoto" <ocean@...2.ccsnet.ne.jp>
Date: 2004-09-03 01:23:40 UTC
List: ruby-dev #24207
山本です。

tcl/tk を参考に下のようなコードを書いたのですが、Proc の数と TkCore::INTERP.tk_cmd_tbl
のサイズが際限なく大きくなることに気づきました。TkTimer を使えば両方とも増えないように
書けるのですが、Tk.after がこうなるのは意図された動作でしょうか?

ext/tk/sample/ にも同様のコードがあったので、気になりました。

(個人的には、Tk.after ってコンパクトに書けて好きです。各イテレーションの変数が引数に
  まとめられて見た目にもわかりやすいし)

#!/usr/bin/env ruby

require "tk"

TkCanvas.new { |c|
  #width 300
  #height 300
  #                    x1  y1  x2   y2
  $arc = TkcArc.new(c, 10, 10, 110, 110, "start" => 0, "extent" => 270)
  pack
}

def timer(n)
  Tk.after(100, proc {
    $arc.move(30 * Math.sin(Math::PI * n / 10), 0) # move
    $arc.start = n * 20 # rotate
    timer(n + 1) # repeat timer
  })
end

timer(0) # start timer

Thread.new {
  loop {
    sleep(2)
    GC.start
    i = 0
    ObjectSpace.each_object(Proc) {|o| i += 1}
    p [i, TkCore::INTERP.tk_cmd_tbl.size]
  }
}

Tk.mainloop

/////////////////
// result

E:\>ruby f.rb
[22, 18]
[39, 35]
[57, 53]
[73, 70]
[90, 87]
[108, 104]
[125, 121]



In This Thread

Prev Next