20#if defined OS_MAC || defined OS_IOS
22Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
24 return new Timer_impl(func, intervalMs);
27Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
29, mIntervalMs(intervalMs)
31 CFRunLoopTimerContext context;
34 context.retain =
nullptr;
35 context.release =
nullptr;
36 context.copyDescription =
nullptr;
37 CFTimeInterval interval = intervalMs / 1000.0;
38 CFRunLoopRef runLoop = CFRunLoopGetMain();
39 mOSTimer = CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent(), interval, 0, 0, TimerProc, &context);
40 CFRunLoopAddTimer(runLoop, mOSTimer, kCFRunLoopCommonModes);
43Timer_impl::~Timer_impl()
48void Timer_impl::Stop()
52 CFRunLoopTimerInvalidate(mOSTimer);
58void Timer_impl::TimerProc(CFRunLoopTimerRef timer,
void *info)
60 Timer_impl* itimer = (Timer_impl*) info;
61 itimer->mTimerFunc(*itimer);
66Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
68 return new Timer_impl(func, intervalMs);
71WDL_Mutex Timer_impl::sMutex;
72WDL_PtrList<Timer_impl> Timer_impl::sTimers;
74Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
76, mIntervalMs(intervalMs)
79 ID = SetTimer(0, 0, intervalMs, TimerProc);
83 WDL_MutexLock lock(&sMutex);
88Timer_impl::~Timer_impl()
93void Timer_impl::Stop()
98 WDL_MutexLock lock(&sMutex);
99 sTimers.DeletePtr(
this);
104void CALLBACK Timer_impl::TimerProc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
106 WDL_MutexLock lock(&sMutex);
108 for (
auto i = 0; i < sTimers.GetSize(); i++)
110 Timer_impl* pTimer = sTimers.Get(i);
112 if (pTimer->ID == idEvent)
114 pTimer->mTimerFunc(*pTimer);
120Timer* Timer::Create(ITimerFunction func, uint32_t intervalMs)
122 return new Timer_impl(func, intervalMs);
125Timer_impl::Timer_impl(ITimerFunction func, uint32_t intervalMs)
128 ID = emscripten_set_interval(TimerProc, intervalMs,
this);
131Timer_impl::~Timer_impl()
136void Timer_impl::Stop()
138 emscripten_clear_interval(ID);
141void Timer_impl::TimerProc(
void* userData)
143 Timer_impl* itimer = (Timer_impl*) userData;
144 itimer->mTimerFunc(*itimer);
This file includes classes for implementing timers - in order to get a regular callback on the main t...