static AutoCloseable dm_timerWithFieldSecondsInterval_startNow(S field, Runnable r) { DynModule m = dm_current_mandatory(); new Flag cancel; thread "Timer" { Long lastFired = null; while (licensed() && !cancel.isUp()) { if (lastFired != null) { long interval = toMS(toDouble(get(m, field))); if (interval <= 0) fail("Need delay > 0: " + field + " in " + m); sleepUntilSysTime(lastFired+interval); } lastFired = sysNow(); if (licensed() && !cancel.isUp()) callF(r); } } ret flagAsAutoCloseable(cancel); }