I would like to start a timer in my common lisp application that after a certain amount of time it will call a certain method. What would be the best way to accomplish this?
With SBCL: make-timer
and schedule-timer
SBCL has built-in functions for this.
SBCL supports a system-wide event scheduler implemented on top of setitimer that also works with threads but does not require a separate scheduler thread.
This examples executes a function after 2 seconds:
(schedule-timer (make-timer (lambda ()
(write-line "Hello, world")
(force-output)))
2)
Among other methods we have unschedule-timer
and list-all-timers
.
Xach Bean's timer dates from 2003. It is possible these SBCL methods are more recent.
With Clerk, "a cron-like scheduler with a sane DSL"
With the Clerk library, we can run regular jobs:
(job "Say 'Hi' all the time" every 5.seconds (print "Hi"))
This will run every 5 seconds. Without "every" it would be a one-time job:
(job "Extraordinary event" in 5.days (send-mail "Don't forget X"))
where we can use any word instead of "in".
See also
I also encountered but didn't try https://github.com/Shinmera/simple-tasks
http://www.cliki.net/TIMER implements relative time based scheduling, which i THINK is what you mean
You could use CL's SLEEP, unless you need more precise timing (since SLEEP is permitted to use approximate timing.)
In LispWorks, if more precise timing is needed, one could use LispWorks' timer scheduling interface.
Note that, same as Zach Beane's TIMER, this is not implementation-agnostic.
© 2022 - 2024 — McMap. All rights reserved.