Credit [RS] with canonicalization of proc every {ms body} {eval $body; after $ms [info level 0]} In the case of a body/script that takes a considerable time fraction of the interval time, the following [every] is more precise, provided the script under repetitive execution will ''normally'' not execute longer than the interval duration: proc every {ms body} {after $ms [info level 0]; eval $body} The after command is set up ''prior'' to the script call ([RJM]). [FPX]: Note that the latter may not be a good idea if the body (a) may in fact take longer to execute than the interval, and (b) invokes, at some point, the event loop. In that case, you might want to guard against reentrancy. ---- # this every uses a repeats limit and a fixed 1ms inner interval (1 ms is a reliable rate when small intervals # are required) set _count 0 set _rep 0 proc every {ms repeats body} { global _count _rep ;# 'static' variables if {$_rep <= 0} {set _rep $repeats} if {!$_count} {set _count [expr {$ms ? $ms : 1}]} set id [after 1 [info level 0]] ;# use 1 and count for ms ms if {[incr _count -1]} return # timed script execute if 1 $body if {![incr _rep -1]} {after cancel $id} } Perhaps not very elegant compared to the initial version(s). The fixed 1 ms inner time interval shall be more precise in the range until about 20 ms (System, platform dependent - see top of [after]) - [RJM]. ---- [Category Command]