Class TkRTTimer
In: tk/lib/tk/timer.rb
Parent: TkTimer

Methods

Constants

DEFAULT_OFFSET_LIST_SIZE = 5

Public Class methods

[Source]

# File tk/lib/tk/timer.rb, line 511
  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

[Source]

# File tk/lib/tk/timer.rb, line 527
  def cancel
    super()
    @est_time = nil
    @cb_start_time = Time.now
    self
  end

[Source]

# File tk/lib/tk/timer.rb, line 614
  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 tk/lib/tk/timer.rb, line 535
  def continue(wait=nil)
    fail RuntimeError, "is already running" if @running
    @cb_start_time = Time.now
    super(wait)
  end

[Source]

# File tk/lib/tk/timer.rb, line 541
  def set_interval(interval)
    super(interval)
    @est_time = nil
  end

[Source]

# File tk/lib/tk/timer.rb, line 562
  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
      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
        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 tk/lib/tk/timer.rb, line 520
  def start(*args, &b)
    return nil if @running
    @est_time = nil
    @cb_start_time = Time.now
    super(*args, &b)
  end
stop()

Alias for cancel

[Validate]