framework2
67 строк · 1.5 Кб
1#include "ofTimer.h"2
3#define NANOS_PER_SEC 1000000000ll4
5void ofGetMonotonicTime(uint64_t & seconds, uint64_t & nanoseconds);6
7ofTimer::ofTimer()8:nanosPerPeriod(0)9#ifdef TARGET_WIN3210,hTimer(CreateWaitableTimer(nullptr, TRUE, nullptr))11#endif12{
13
14}
15
16void ofTimer::reset(){17#if defined(TARGET_WIN32)18GetSystemTimeAsFileTime((LPFILETIME)&nextWakeTime);19#else20nextWakeTime = ofGetCurrentTime();21#endif22calculateNextPeriod();23}
24
25void ofTimer::setPeriodicEvent(uint64_t nanoseconds){26nanosPerPeriod = std::chrono::nanoseconds(nanoseconds);27reset();28}
29
30void ofTimer::waitNext(){31#if (defined(TARGET_LINUX) && !defined(TARGET_RASPBERRY_PI_LEGACY))32timespec remainder = {0,0};33timespec wakeTime = nextWakeTime.getAsTimespec();34clock_nanosleep(CLOCK_MONOTONIC,TIMER_ABSTIME,&wakeTime,&remainder);35#elif defined(TARGET_WIN32)36WaitForSingleObject(hTimer, INFINITE);37#else38auto now = ofGetCurrentTime();39if(now < nextWakeTime){40auto waitNanos = nextWakeTime - now;41timespec waittime = (ofTime() + waitNanos).getAsTimespec();42timespec remainder = {0,0};43nanosleep(&waittime, &remainder);44}45#endif46calculateNextPeriod();47}
48
49
50void ofTimer::calculateNextPeriod(){51#if defined(TARGET_WIN32)52nextWakeTime.QuadPart += nanosPerPeriod.count()/100;53LARGE_INTEGER now;54GetSystemTimeAsFileTime((LPFILETIME)&now);55if(nextWakeTime.QuadPart<now.QuadPart){56reset();57}else{58SetWaitableTimer(hTimer, &nextWakeTime, 0, nullptr, nullptr, 0);59}60#else61nextWakeTime += nanosPerPeriod;62auto now = ofGetCurrentTime();63if(nextWakeTime<now){64reset();65}66#endif67}
68