# File tk/lib/tk/timer.rb, line 40 def self.callback(obj_id) ex_obj = Tk_CBTBL[obj_id] return "" if ex_obj == nil; # canceled ex_obj.cb_call end
# File tk/lib/tk/timer.rb, line 46 def self.info(obj = nil) if obj if obj.kind_of?(TkTimer) if obj.after_id inf = tk_split_list(tk_call_without_enc('after','info',obj.after_id)) [Tk_CBTBL[inf[0][1]], inf[1]] else nil end else fail ArgumentError, "TkTimer object is expected" end else tk_call_without_enc('after', 'info').split(' ').collect!{|id| ret = Tk_CBTBL.find{|key,val| val.after_id == id} (ret == nil)? id: ret[1] } end end
# File tk/lib/tk/timer.rb, line 148 def initialize(*args, &b) Tk_CBID.mutex.synchronize{ # @id = Tk_CBID.join('') @id = Tk_CBID.join(TkCore::INTERP._ip_id_) Tk_CBID[1].succ! } @wait_var = TkVariable.new(0) @at_end_proc = nil @cb_cmd = TkCore::INTERP.get_cb_entry(self.method(:do_callback)) @set_next = true @init_sleep = 0 @init_proc = nil @init_args = [] @current_script = [] @current_proc = nil @current_args = nil @return_value = nil @sleep_time = 0 @current_sleep = 0 @loop_exec = 0 @do_loop = 0 @loop_proc = [] @proc_max = 0 @current_pos = 0 @after_id = nil @after_script = nil @cancel_on_exception = DEFAULT_IGNORE_EXCEPTIONS # Unless @cancel_on_exception, Ruby/Tk shows an error dialog box when # an exception is raised on TkTimer callback procedure. # If @cancel_on_exception is an array of exception classes and the raised # exception is included in the array, Ruby/Tk cancels executing TkTimer # callback procedures silently (TkTimer#cancel is called and no dialog is # shown). if b case args.size when 0 add_procs(b) when 1 args << -1 << b else args << b end end set_procs(*args) if args != [] @running = false @in_callback = false end
# File tk/lib/tk/timer.rb, line 313 def add_procs(*procs) procs.each{|e| # if e.kind_of?(Proc) if TkComm._callback_entry?(e) @loop_proc.push([e]) else @loop_proc.push(e) end } @proc_max = @loop_proc.size self end
# File tk/lib/tk/timer.rb, line 486 def at_end(*arg, &b) if arg.empty? if b @at_end_proc = b else # no proc return @at_end_proc end else fail ArgumentError, "wrong number of arguments" if arg.length != 1 || b @at_end_proc = arg[0] end self end
# File tk/lib/tk/timer.rb, line 439 def cancel @running = false # @wait_var.value = 0 __at_end__ tk_call 'after', 'cancel', @after_id if @after_id @after_id = nil Tk_CBTBL.delete(@id) ;# for GC self end
# File tk/lib/tk/timer.rb, line 241 def cancel_on_exception=(mode) if mode.kind_of?(Array) @cancel_on_exception = mode elsif mode @cancel_on_exception = DEFAULT_IGNORE_EXCEPTIONS else @cancel_on_exception = false end #self end
# File tk/lib/tk/timer.rb, line 237 def cancel_on_exception? @cancel_on_exception end
# File tk/lib/tk/timer.rb, line 451 def continue(wait=nil) fail RuntimeError, "is already running" if @running return restart() if @current_script.empty? sleep, cmd = @current_script fail RuntimeError, "no procedure to continue" unless cmd if wait unless wait.kind_of?(Integer) fail ArgumentError, "expect Integer for 1st argument" end sleep = wait end Tk_CBTBL[@id] = self @running = true @after_id = tk_call_without_enc('after', sleep, cmd) self end
# File tk/lib/tk/timer.rb, line 232 def current_status [@running, @current_sleep, @current_proc, @current_args, @do_loop, @cancel_on_exception] end
# File tk/lib/tk/timer.rb, line 343 def delete_at(n) @loop_proc.delete_at(n) @proc_max = @loop_proc.size cancel if @proc_max == 0 self end
# File tk/lib/tk/timer.rb, line 327 def delete_procs(*procs) procs.each{|e| # if e.kind_of?(Proc) if TkComm._callback_entry?(e) @loop_proc.delete([e]) else @loop_proc.delete(e) end } @proc_max = @loop_proc.size cancel if @proc_max == 0 self end
instance methods
# File tk/lib/tk/timer.rb, line 70 def do_callback @in_callback = true @after_id = nil begin @return_value = @current_proc.call(self) rescue SystemExit exit(0) rescue Interrupt exit!(1) rescue Exception => e if @cancel_on_exception && @cancel_on_exception.find{|exc| e.kind_of?(exc)} cancel @return_value = e @in_callback = false return e else fail e end end if @set_next set_next_callback(@current_args) else @set_next = true end @in_callback = false @return_value end
# File tk/lib/tk/timer.rb, line 526 def eventloop_tkwait wait(false, true) end
# File tk/lib/tk/timer.rb, line 517 def eventloop_wait(check_root = false) wait(false, check_root) end
# File tk/lib/tk/timer.rb, line 228 def get_procs [@init_sleep, @init_proc, @init_args, @sleep_time, @loop_exec, @loop_proc] end
# File tk/lib/tk/timer.rb, line 477 def info if @after_id inf = tk_split_list(tk_call_without_enc('after', 'info', @after_id)) [Tk_CBTBL[inf[0][1]], inf[1]] else nil end end
# File tk/lib/tk/timer.rb, line 260 def loop_rest=(rest) @do_loop = rest #self end
# File tk/lib/tk/timer.rb, line 412 def reset(*reset_args) restart() if @running if @init_proc @return_value = @init_proc.call(self) else @return_value = nil end @current_pos = 0 @current_args = @init_args @current_script = [] @set_next = false if @in_callback self end
# File tk/lib/tk/timer.rb, line 430 def restart(*restart_args, &b) cancel if @running if restart_args.empty? && !b start(@init_sleep, @init_proc, *@init_args) else start(*restart_args, &b) end end
# File tk/lib/tk/timer.rb, line 99 def set_callback(sleep, args=nil) if TkCore::INTERP.deleted? self.cancel return self end @after_script = "rb_after #{@id}" @current_args = args @current_script = [sleep, @after_script] @after_id = tk_call_without_enc('after', sleep, @after_script) self end
# File tk/lib/tk/timer.rb, line 265 def set_interval(interval) #if interval != 'idle' && interval != :idle \ # && !interval.kind_of?(Integer) && !interval.kind_of?(Proc) if interval != 'idle' && interval != :idle && !interval.kind_of?(Integer) && !TkComm._callback_entry?(interval) fail ArgumentError, "expect Integer or Proc" end @sleep_time = interval end
# File tk/lib/tk/timer.rb, line 111 def set_next_callback(args) if @running == false || @proc_max == 0 || @do_loop == 0 Tk_CBTBL.delete(@id) ;# for GC @running = false # @wait_var.value = 0 __at_end__ return end if @current_pos >= @proc_max if @do_loop < 0 || (@do_loop -= 1) > 0 @current_pos = 0 else Tk_CBTBL.delete(@id) ;# for GC @running = false # @wait_var.value = 0 __at_end__ return end end @current_args = args # if @sleep_time.kind_of?(Proc) if TkComm._callback_entry?(@sleep_time) sleep = @sleep_time.call(self) else sleep = @sleep_time end @current_sleep = sleep cmd, *cmd_args = @loop_proc[@current_pos] @current_pos += 1 @current_proc = cmd set_callback(sleep, cmd_args) end
# File tk/lib/tk/timer.rb, line 275 def set_procs(interval, loop_exec, *procs) #if interval != 'idle' && interval != :idle \ # && !interval.kind_of?(Integer) && !interval.kind_of?(Proc) if interval != 'idle' && interval != :idle && !interval.kind_of?(Integer) && !TkComm._callback_entry?(interval) fail ArgumentError, "expect Integer or Proc for 1st argument" end @sleep_time = interval @loop_proc = [] procs.each{|e| # if e.kind_of?(Proc) if TkComm._callback_entry?(e) @loop_proc.push([e]) else @loop_proc.push(e) end } @proc_max = @loop_proc.size @current_pos = 0 if loop_exec.kind_of?(Integer) && loop_exec < 0 @loop_exec = -1 elsif loop_exec == true @loop_exec = -1 elsif loop_exec == nil || loop_exec == false || loop_exec == 0 @loop_exec = 0 else if not loop_exec.kind_of?(Integer) fail ArgumentError, "expect Integer for 2nd argument" end @loop_exec = loop_exec end @do_loop = @loop_exec self end
# File tk/lib/tk/timer.rb, line 350 def set_start_proc(sleep=nil, init_proc=nil, *init_args, &b) # set parameters for 'restart' sleep = @init_sleep unless sleep if sleep != 'idle' && sleep != :idle && !sleep.kind_of?(Integer) fail ArgumentError, "expect Integer or 'idle' for 1st argument" end @init_sleep = sleep @init_proc = init_proc @init_args = init_args @init_proc = b if !@init_proc && b @init_proc = proc{|*args| } if @init_sleep > 0 && !@init_proc self end
# File tk/lib/tk/timer.rb, line 468 def skip fail RuntimeError, "is not running now" unless @running cancel Tk_CBTBL[@id] = self @running = true set_next_callback(@current_args) self end
# File tk/lib/tk/timer.rb, line 368 def start(*init_args, &b) return nil if @running Tk_CBTBL[@id] = self @do_loop = @loop_exec @current_pos = 0 @return_value = nil @after_id = nil @init_sleep = 0 @init_proc = nil @init_args = nil argc = init_args.size if argc > 0 sleep = init_args.shift if sleep != 'idle' && sleep != :idle && !sleep.kind_of?(Integer) fail ArgumentError, "expect Integer or 'idle' for 1st argument" end @init_sleep = sleep end @init_proc = init_args.shift if argc > 1 @init_args = init_args if argc > 2 @init_proc = b if !@init_proc && b @init_proc = proc{|*args| } if @init_sleep > 0 && !@init_proc @current_sleep = @init_sleep @running = true if @init_proc # if not @init_proc.kind_of?(Proc) if !TkComm._callback_entry?(@init_proc) fail ArgumentError, "Argument '#{@init_proc}' need to be Proc" end @current_proc = @init_proc set_callback(@init_sleep, @init_args) @set_next = false if @in_callback else set_next_callback(@init_args) end self end
# File tk/lib/tk/timer.rb, line 529 def thread_tkwait wait(true, true) end
# File tk/lib/tk/timer.rb, line 520 def thread_wait(check_root = false) wait(true, check_root) end
# File tk/lib/tk/timer.rb, line 523 def tkwait(on_thread = true) wait(on_thread, true) end
# File tk/lib/tk/timer.rb, line 501 def wait(on_thread = true, check_root = false) unless @running if @return_value.kind_of?(Exception) fail @return_value else return @return_value end end @wait_var.wait(on_thread, check_root) if @return_value.kind_of?(Exception) fail @return_value else @return_value end end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.