35 shouldCancelCallbacks.
store (
true);
41 if (timer.getIntervalMs() > 0)
44 jassert (timer.getIntervalMs() == 0);
50 && timer.getIntervalMs() <= 0;
57 int getIntervalMs()
const
60 return timer.getIntervalMs();
63 bool isTimerRunning()
const
65 return getIntervalMs() > 0;
69 void onTimerExpired()
final
92 callbackThreadId.
store ({});
125 impl->startTimer (0);
130 return impl->getIntervalMs();
135 return impl->isTimerRunning();
147 void runTest()
override
151 beginTest (
"Start/stop a timer");
166 expect (! timer.isTimerRunning());
167 expect (timer.getTimerInterval() == 0);
169 timer.startTimer (1);
170 expect (timer.isTimerRunning());
171 expect (timer.getTimerInterval() == 1);
176 expect (! timer.isTimerRunning());
177 expect (timer.getTimerInterval() == 0);
180 beginTest (
"Stop a timer from the timer callback");
184 auto timerCallback = [&] (Timer& timer)
186 expect (timer.isTimerRunning());
188 expect (! timer.isTimerRunning());
192 Timer timer {[&]{ timerCallback (timer); }};
193 timer.startTimer (1);
197 beginTest (
"Restart a timer from the timer callback");
199 WaitableEvent restartTimer;
209 expect (timer.getTimerInterval() == 1);
211 timer.startTimer (2);
212 expect (timer.getTimerInterval() == 2);
217 expect (timer.getTimerInterval() == 2);
226 timer.startTimer (1);
227 expect (timer.getTimerInterval() == 1);
229 restartTimer.signal();
231 expect (timer.getTimerInterval() == 2);
237 beginTest (
"Calling stopTimer on a timer, waits for any timer callbacks to finish");
259 timer.startTimer (1);
267 beginTest (
"Calling stopTimer on a timer, waits for any timer callbacks to finish, even if the timer callback calls stopTimer first");
283 timer.startTimer (1);
291 beginTest (
"Adjusting a timer period from outside the timer callback doesn't cause data races");
303 expect (timer.getTimerInterval() == 1);
311 expect (timer.getTimerInterval() == 2);
321 timer.startTimer (1);
324 timer.startTimer (2);
334 beginTest (
"A timer can be restarted externally, after being stopped internally");
357 expect (! timer.isTimerRunning());
358 timer.startTimer (1);
359 expect (timer.isTimerRunning());
362 expect (! timer.isTimerRunning());
364 timer.startTimer (1);
365 expect (timer.isTimerRunning());
369 beginTest (
"Calls to `startTimer` and `getTimerInterval` succeed while a callback is blocked");
381 timer.startTimer (1);
384 expect (timer.getTimerInterval() == 1);
385 timer.startTimer (2);
386 expect (timer.getTimerInterval() == 2);
392 beginTest (
"Stress test");
401 auto timer = std::make_unique<Timer> ([]{});
402 timer->startTimer (1);
404 if (! timer->isTimerRunning())
410 expect (timers.
size() >= 16);
414 class Timer
final :
public HighResolutionTimer
420 ~Timer()
override { stopTimer(); }
422 void hiResTimerCallback()
override { callback(); }
A high-resolution periodic timer.
virtual ~HighResolutionTimer()
Destructor.
virtual void hiResTimerCallback()=0
The user-defined callback routine that actually gets called periodically.
int getTimerInterval() const noexcept
Returns the timer's interval.
HighResolutionTimer()
Creates a HighResolutionTimer.
bool isTimerRunning() const noexcept
Checks if the timer has been started.
void stopTimer()
Stops the timer.
void startTimer(int intervalInMilliseconds)
Starts the timer and sets the length of interval required.
static void JUCE_CALLTYPE sleep(int milliseconds)
Suspends the execution of the current thread until the specified timeout period has elapsed (note tha...
This is a base class for classes that perform a unit test.
constexpr Type jmax(Type a, Type b)
Returns the larger of two values.
Type unalignedPointerCast(void *ptr) noexcept
Casts a pointer to another type via void*, which suppresses the cast-align warning which sometimes ar...