class TkRTTimer
Constants
- DEFAULT_OFFSET_LIST_SIZE
Public Class Methods
new(*args, &b)
click to toggle source
Calls superclass method
TkTimer.new
# File lib/tk/timer.rb, line 539 def initialize(*args, &b) super(*args, &b) @offset_list = Array.new(DEFAULT_OFFSET_LIST_SIZE){ [0, 0] } @offset_s = 0 @offset_u = 0 @est_time = nil end
Public Instance Methods
cancel()
click to toggle source
Calls superclass method
TkTimer#cancel
# File lib/tk/timer.rb, line 555 def cancel super() @est_time = nil @cb_start_time = Time.now self end
Also aliased as: stop
cb_call()
click to toggle source
# File lib/tk/timer.rb, line 644 def cb_call if @est_time @offset_list.shift @cb_start_time = Time.now if @current_sleep == 0 @offset_list.push([ @offset_s - @cb_start_time.to_i, @offset_u - @cb_start_time.usec ]) else @offset_list.push([ @offset_s + (@est_time.to_i - @cb_start_time.to_i), @offset_u + (@est_time.usec - @cb_start_time.usec) ]) end end @cb_cmd.call end
continue(wait=nil)
click to toggle source
Calls superclass method
TkTimer#continue
# File lib/tk/timer.rb, line 563 def continue(wait=nil) fail RuntimeError, "is already running" if @running @cb_start_time = Time.now super(wait) end
set_interval(interval)
click to toggle source
Calls superclass method
TkTimer#set_interval
# File lib/tk/timer.rb, line 569 def set_interval(interval) super(interval) @est_time = nil end
set_next_callback(args)
click to toggle source
# File lib/tk/timer.rb, line 590 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 cmd, *cmd_args = @loop_proc[@current_pos] @current_pos += 1 @current_proc = cmd @offset_s, @offset_u = _offset_ave if TkComm._callback_entry?(@sleep_time) sleep = @sleep_time.call(self) else sleep = @sleep_time end if @est_time @est_time = Time.at(@est_time.to_i, @est_time.usec + sleep*1000) else @est_time = Time.at(@cb_start_time.to_i, @cb_start_time.usec + sleep*1000) end now = Time.now real_sleep = ((@est_time.to_i - now.to_i + @offset_s)*1000.0 + (@est_time.usec - now.usec + @offset_u)/1000.0).round if real_sleep <= 0 real_sleep = 0 @offset_s = now.to_i @offset_u = now.usec end @current_sleep = real_sleep set_callback(real_sleep, cmd_args) end
start(*args, &b)
click to toggle source
Calls superclass method
TkTimer.start
# File lib/tk/timer.rb, line 548 def start(*args, &b) return nil if @running @est_time = nil @cb_start_time = Time.now super(*args, &b) end
Private Instance Methods
_offset_ave()
click to toggle source
# File lib/tk/timer.rb, line 574 def _offset_ave size = 0 d_sec = 0; d_usec = 0 @offset_list.each_with_index{|offset, idx| # weight = 1 weight = idx + 1 size += weight d_sec += offset[0] * weight d_usec += offset[1] * weight } offset_s, mod = d_sec.divmod(size) offset_u = ((mod * 1000000 + d_usec) / size.to_f).round [offset_s, offset_u] end