non-blocking, frame-based timer with Func callback