立石@JAISTです。

デモのTimerができました。
以前と同じように

http://www.pluto.dti.ne.jp/~tateishi/ftp/ruby-tk-demo/

においておきます。
これを作成の際にafterが動作しなかったので
tk.rbを修正しました。
以下がパッチですが、あまり自信は
ないです。一応ちゃんと動作してる
ようですが、、、、
(ruby-1.1b9_27を元に作成してます。)

Threadを使ってもよかったのですが、こちらだと
直接tclのコマンドを呼ぶわけじゃないのでスピード
を要求されるようなものには不向きでした。

*** tk.rb	Sat Jun 20 07:54:13 1998
--- tk.rb.new	Sat Jun 20 07:44:47 1998
***************
*** 284,312 ****
      TkGrid.configure *args
    end
  
-   def after(ms, cmd=Proc.new)
-       myid = _curr_cmd_id
-       INTERP._eval('after '+ms+' '+_get_eval_string(install_cmd(proc{
- 		      TkUtil.eval_cmd cmd
- 		      uninstall_cmd myid
- 		    })))
-     return
-     if false #defined? Thread
-       Thread.start do
- 	ms = Float(ms)/1000
- 	ms = 10 if ms == 0
- 	sleep ms/1000
- 	cmd.call
-       end
-     else
-       myid = _curr_cmd_id
-       INTERP._eval('after '+ms+' '+_get_eval_string(install_cmd(proc{
- 		      TkUtil.eval_cmd cmd
- 		      uninstall_cmd myid
- 		    })))
-     end
-   end
- 
    def update(idle=nil)
      if idle
        tk_call 'update', 'idletasks'
--- 284,289 ----
***************
*** 323,328 ****
--- 300,323 ----
  
    INTERP = TclTkIp.new
    INTERP._invoke("proc", "rb_out", "args", "ruby [format \"TkCore.callback %%Q!%s!\" $args]")
+ 
+   def after(ms, cmd=Proc.new)
+     myid = _curr_cmd_id
+     cmdid = install_cmd(cmd)
+     tk_call("after",ms,cmdid)
+     return
+     if false #defined? Thread
+       Thread.start do
+ 	ms = Float(ms)/1000
+ 	ms = 10 if ms == 0
+ 	sleep ms/1000
+ 	cmd.call
+       end
+     else
+       cmdid = install_cmd(cmd)
+       tk_call("after",ms,cmdid)
+     end
+   end
  
    def TkCore.callback(arg)
      arg = Array(tk_split_list(arg))