Time utilities
Isis software documentation
Time utilities
This document explains the various utilities for dealing with time in
Isis, including timer objects, synchronizing networked computers, and
putting the process to sleep.
Sleeping
(sleep seconds) # sleep for a number of seconds
(microsleep microseconds) # sleep for a number of microseconds
sleep and microsleep puts the process to sleep for
the specified number of seconds or microseconds, which may be an
integer or real number with a fractional part. They returns
True after the interval has expired, or False if an
error occurred.
Timers
An Isis timer is an object that keeps track of elapsed time.
When you create a timer, it begins counting immediately from zero. At
any time later, you can query the timer for the current elapsed time,
or reset the timer to zero.
(new-timer) # create a new timer object
new-timer creates and returns a new timer object. This
object is a procedure that you can call with different arguments to
operate on the timer in different ways.
(timer) # get elapsed time
(timer 'r') # reset elapsed time to 0.0
Calling a timer with no arguments returns the current elapsed time, as
a real number. Calling the timer with a single argument 'r'
(for "reset") resets the timer to zero.
(timer 'z') # get the "zero" system time of the timer
(timer 'z' system-time) # set the "zero" system time of the timer
(new-timer system-time) # sets "zero" system time on creation
Calling a timer with a single argument 'z' returns the
internal "zero" system time that the timer uses as a reference
to determine the elapsed time, and by passing one additional argument,
you can modify the zero system time. You can also pass a zero system
time as an argument when you create the timer. You will only need to
query and modify the zero system time of the timer if you are
attempting to synchronize two or more timers in different processes or
on different machines. See the section below for more information on
system time.
(print-frames-per-second timer framecount) # prints a nice fps message
This utility routine accepts a timer and the number of "frames" or
other items that have been processed since the zero time of that
timer, and it prints a convenient "frames per second" message.
Below is an example that creates a timer, and prints out the elapsed
time approximately every 2 seconds, and resets the timer every 30
seconds.
(set timer (new-timer)) # create a timer
(while True # loop forever
(begin
(sleep 2) # sleep a couple seconds
(set curtime (timer)) # get current time
(print curtime "seconds have elapsed." newline) # print a message
(if (> curtime 30.0) (timer 'r')))) # reset every 30 seconds
System time
(get-time) # get current system time [secs microsecs]
(master-sync port reps) # synchronize system time on 2 machines
(slave-sync port reps) # returns offset to ADD to master times
get-time retrieves the current system time, which serves as
the base for all timing and synchronization in Isis. System times are
represented as a list of two integers: the number of seconds and
microseconds since January 1, 1970.
-> (get-time)
[ 860617823 584033 ]
-> (get-time)
[ 860617831 514603 ]
master-sync and slave-sync provide a means of
synchronizing system times on two machines. First, establish a
connection between two machines. Then, on the master machine, call
the master-sync function with the port used to communicate to
the slave. On the slave machine, call slave-sync with the
port used to communicate with the master. reps specifies the
number of trials to perform and average over to find the result and
must be the same on both machines. slave-sync will return a
system time offset that should be added to master times in
order to synchronize. See the example below.
On the "master" machine:
-> (set serv (tcp-listen 1234))
3
-> (set port (tcp-accept serv))
4
-> (master-sync port 20)
20
-> (master-sync port 20)
20
-> (master-sync port 20)
20
-> (slave-sync port 20)
[ 0 -7988 ]
-> (slave-sync port 20)
[ 0 -7894 ]
-> (slave-sync port 20)
[ 0 -7530 ]
On the "slave" machine:
-> (set port (tcp-open "alphaville" 1234))
3
-> (slave-sync port 20)
[ 0 7693 ]
-> (slave-sync port 20)
[ 0 7274 ]
-> (slave-sync port 20)
[ 0 7324 ]
-> (master-sync port 20)
20
-> (master-sync port 20)
20
-> (master-sync port 20)
20