Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
# File tk/lib/tk/timer.rb, line 39 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 45 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 147 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 excepsion 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 312 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 485 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 438 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 240 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 236 def cancel_on_exception? @cancel_on_exception end
# File tk/lib/tk/timer.rb, line 450 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 231 def current_status [@running, @current_sleep, @current_proc, @current_args, @do_loop, @cancel_on_exception] end
# File tk/lib/tk/timer.rb, line 342 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 326 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 69 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 529 def eventloop_tkwait wait(false, true) end
# File tk/lib/tk/timer.rb, line 520 def eventloop_wait(check_root = false) wait(false, check_root) end
# File tk/lib/tk/timer.rb, line 227 def get_procs [@init_sleep, @init_proc, @init_args, @sleep_time, @loop_exec, @loop_proc] end
# File tk/lib/tk/timer.rb, line 476 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 259 def loop_rest=(rest) @do_loop = rest #self end
# File tk/lib/tk/timer.rb, line 411 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 429 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 98 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 264 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 110 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 274 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 349 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 467 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 367 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 532 def thread_tkwait wait(true, true) end
# File tk/lib/tk/timer.rb, line 523 def thread_wait(check_root = false) wait(true, check_root) end
# File tk/lib/tk/timer.rb, line 526 def tkwait(on_thread = true) wait(on_thread, true) end
# File tk/lib/tk/timer.rb, line 500 def wait(on_thread = true, check_root = false) if $SAFE >= 4 fail SecurityError, "can't wait timer at $SAFE >= 4" end 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.