Description: |
According to the description in the tcl user guide the
after command should execute a script after a time
delay (timespan specified by the first argument).
When changing the system-time all pending timer
operations are affected to behave wrong.
If the time is being changed to a future time all timers
are reduced: delay -=(Tnew-Told).
If the time is being changed to a time in the past all
timers are extended: delay += (Told-Tnew).
This implemented behavior should be realized by an at-
command at <utcTime> [<script>], eg: at [expr 100+
[clock seconds] ] { puts "hello world" }, not by the after-
command.
If you have cyclic tasks (e.g. retry timer) this
(implemented) behavior of the after command is not
useable.
If time synchronization on computers is being applied on
batteryless computer systems this behavior arises at
least every time the system starts.
Solution:
Do not use the time()-command to implement the timer.
Instead of doing this use an monotonically increasing
timer like GetTickCount() on Windows-system and
equivalent calls on other platforms.
|
User Comments: |
kennykb added on 2004-10-31 01:18:47:
Logged In: YES
user_id=99768
Alas, there isn't any way to *wait* for a monotonically
increasing timer in either Windows or Unix. Kernel calls
such as MsgWaitForMultipleObjectsEx (the central call
of the Windows notifier) and select (the central call of
the Unix notifier) both use the system clock as a reference.
While the behavior that you request may be useful,
it simply doesn't appear possible given the underlying
API's provided by the kernels.
|