class TkRTTimer
Constants
- DEFAULT_OFFSET_LIST_SIZE
Public Class Methods
Source
# File lib/tk/timer.rb, line 540 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
Calls superclass method
TkTimer::new
Public Instance Methods
Source
# File lib/tk/timer.rb, line 556 def cancel super() @est_time = nil @cb_start_time = Time.now self end
Calls superclass method
TkTimer#cancel
Also aliased as: stop
Source
# File lib/tk/timer.rb, line 645 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
Source
# File lib/tk/timer.rb, line 564 def continue(wait=nil) fail RuntimeError, "is already running" if @running @cb_start_time = Time.now super(wait) end
Calls superclass method
TkTimer#continue
Source
# File lib/tk/timer.rb, line 570 def set_interval(interval) super(interval) @est_time = nil end
Calls superclass method
TkTimer#set_interval
Source
# File lib/tk/timer.rb, line 591 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
Source
# File lib/tk/timer.rb, line 549 def start(*args, &b) return nil if @running @est_time = nil @cb_start_time = Time.now super(*args, &b) end
Calls superclass method
TkTimer::start
Private Instance Methods
Source
# File lib/tk/timer.rb, line 575 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