uses a threaded timer instead of time.time