framework2

Форк
0
67 строк · 1.5 Кб
1
#include "ofTimer.h"
2

3
#define NANOS_PER_SEC 1000000000ll
4

5
void ofGetMonotonicTime(uint64_t & seconds, uint64_t & nanoseconds);
6

7
ofTimer::ofTimer()
8
:nanosPerPeriod(0)
9
#ifdef TARGET_WIN32
10
,hTimer(CreateWaitableTimer(nullptr, TRUE, nullptr))
11
#endif
12
{
13

14
}
15

16
void ofTimer::reset(){
17
#if defined(TARGET_WIN32)
18
	GetSystemTimeAsFileTime((LPFILETIME)&nextWakeTime);
19
#else
20
	nextWakeTime = ofGetCurrentTime();
21
#endif
22
	calculateNextPeriod();
23
}
24

25
void ofTimer::setPeriodicEvent(uint64_t nanoseconds){
26
	nanosPerPeriod = std::chrono::nanoseconds(nanoseconds);
27
	reset();
28
}
29

30
void ofTimer::waitNext(){
31
#if (defined(TARGET_LINUX) && !defined(TARGET_RASPBERRY_PI_LEGACY))
32
	timespec remainder = {0,0};
33
	timespec wakeTime = nextWakeTime.getAsTimespec();
34
	clock_nanosleep(CLOCK_MONOTONIC,TIMER_ABSTIME,&wakeTime,&remainder);
35
#elif defined(TARGET_WIN32)
36
	WaitForSingleObject(hTimer, INFINITE);
37
#else
38
	auto now = ofGetCurrentTime();
39
	if(now < nextWakeTime){
40
		auto waitNanos = nextWakeTime - now;
41
		timespec waittime = (ofTime() + waitNanos).getAsTimespec();
42
		timespec remainder = {0,0};
43
		nanosleep(&waittime, &remainder);
44
	}
45
#endif
46
	calculateNextPeriod();
47
}
48

49

50
void ofTimer::calculateNextPeriod(){
51
#if defined(TARGET_WIN32)
52
	nextWakeTime.QuadPart += nanosPerPeriod.count()/100;
53
    LARGE_INTEGER now;
54
    GetSystemTimeAsFileTime((LPFILETIME)&now);
55
	if(nextWakeTime.QuadPart<now.QuadPart){
56
	    reset();
57
	}else{
58
	    SetWaitableTimer(hTimer, &nextWakeTime, 0, nullptr, nullptr, 0);
59
	}
60
#else
61
	nextWakeTime += nanosPerPeriod;
62
	auto now = ofGetCurrentTime();
63
    if(nextWakeTime<now){
64
        reset();
65
    }
66
#endif
67
}
68

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.