目次
前
次
時間精度向上
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
目次
前
次