The procedure `run-with-timer' bellow, after the Emacs function with
the same name, allows to perform an action after a delay of SECS
seconds.  Call THUNK every SECS seconds then, if REPEAT? is a true
value.

It returns a timer object, which you can use with `cancel-timer!'.

Sample usage:

   (define *timer* 
     (run-with-timer 3 #t (lambda ()
                            (display "Hello!")
                            (newline))))

   (cancel-timer! *timer*)

The code:

   ;;; Timer for Delayed Execution
   ;;; Emilio C. Lopes <eclig@gmx.net>, 2006-06-30

   (define-structure timer 
       (export run-with-timer
               timer?
               cancel-timer!)

     (open define-record-types
           threads
           threads-internal
           locks
           scheme)

     (begin "
   ("

   (define-record-type timer :timer
     (make-timer thread)
     timer?
     (thread timer-thread))

   (define (run-with-timer secs repeat? thunk)
     (let ((lock (make-lock))
           (thread-obj #f)
           (timeout (* secs 1000)))
       (obtain-lock lock)
       (spawn 
        (lambda ()
          (set! thread-obj (current-thread))
          (release-lock lock)
          (let loop ()
            (sleep timeout)
            (thunk)
            (if repeat? (loop)))))
       (obtain-lock lock)
       (make-timer thread-obj)))

   (define (cancel-timer! timer)
     (terminate-thread! (timer-thread timer)))

   ))
