目次

時間精度向上

 1秒ごとのインターバル生成には、「after」を利用していました。

proc show_event {} {
  #
  global ecnt eflag elast
  # show 
  draw_hand
  # handling
  if { $eflag == 1 } {
    incr ecnt
    # ? complete
    if { $ecnt >= $elast } {
      set eflag 0
    }
  }
  after 1000 show_event
}

 「after」で1000msを待っていると、OSが他のアプリケーションに
 CPUを割り当てていた時、処理が終わるまで遅延させます。

 遅延を小さくするためには、待ち状態を短くしておき
 システムタイマーの値を取得して、前回からの差分値
 が、1秒(1000ms)になったことを監視すればよいと
 考えました。

 「after」でスリープ状態になる時間を200msにして
 200msごとに1秒(1000ms)経過をチェックします。

 システムタイマー値を取得するために、「clock clicks -milliseconds」を
 使い、手続きを以下としました。

proc show_time {} {
  #
  global ecnt eflag elast beginTime currentTime
  # get current time
  set currentTime [clock clicks -milliseconds]
  # judge
  if { [expr $currentTime - $beginTime] > 999 } {
    # update
    set beginTime $currentTime
    # show 
    draw_hand
    # handlign
    if { $eflag == 1 } {
      incr ecnt
      # ? complete
      if { $ecnt >= $elast } {
        set eflag 0
      }
    }
  }
  # 200ms
  after 200 show_time
}

 「Exec」ボタンで、手続き「」を起動する前に、その時点の
 システムタイマー値を記憶しておきます。

    # get now time
    set beginTime [clock clicks -milliseconds]
    # loop
    show_time


目次

inserted by FC2 system