sclass FlexibleRateTimer implements AutoCloseable { Runnable action; double hertz; double timestamp; transient DoLater doLater; transient new Flag started; transient volatile bool disposed; *() {} *(double *hertz, Runnable *action) {} void start { if (!started.raise()) ret; _kaboom(); } void _kaboom { if (disposed) ret; dispose doLater; if (timestamp == 0) timestamp = sysNow(); timestamp += 1000/hertz; doLater = new DoLater(iround(timestamp), r { pcallF(action); _kaboom(); }); doLater.enable(); } void cancel { close(); } public void close { set disposed; dispose doLater; } }