91 lines
2.6 KiB
C++
91 lines
2.6 KiB
C++
//
|
|
// Created by Epagris on 2019. 12. 08..
|
|
//
|
|
|
|
#include "Timer.h"
|
|
|
|
namespace eg3d {
|
|
|
|
Timer gTmr1s; // 1 másodperces triggeridejû globális idõzítõ
|
|
|
|
Timer::Timer() : mTriggerTime(sDEF_triggerTime) {
|
|
|
|
// seconds per count beállítása
|
|
int64_t countsPerSecond = 1;
|
|
QueryPerformanceFrequency((LARGE_INTEGER *) & countsPerSecond);
|
|
mSecondsPerCount = 1.0 / (double) countsPerSecond;
|
|
|
|
QueryPerformanceCounter((LARGE_INTEGER *) &mLastTimestamp); // aktuális idõ lekérése
|
|
mLastTriggerTimestamp = mLastTimestamp;
|
|
}
|
|
|
|
void Timer::tick() {
|
|
int64_t currentTime = 0;
|
|
QueryPerformanceCounter((LARGE_INTEGER * ) ¤tTime);
|
|
|
|
// eltelt idõ kiszámítása
|
|
int64_t timeElapsed = currentTime - mLastTimestamp;
|
|
mTimeElapsed = timeElapsed * mSecondsPerCount;
|
|
|
|
// legutolsó trigger óta eltelt idõ kiszámítása
|
|
double triggerTimeElapsed = (currentTime - mLastTriggerTimestamp) * mSecondsPerCount;
|
|
|
|
// ha elértük a triggeridõt
|
|
if (triggerTimeElapsed > mTriggerTime) {
|
|
mLastTriggerTimestamp = currentTime;
|
|
|
|
mRegCBMtx.lock(); // MUTEX!!
|
|
|
|
// minden feliratkozott függvény meghívása
|
|
for (auto cbData : mRegCallbacks) {
|
|
cbData.callBackFn(this, &triggerTimeElapsed, cbData.ptr);
|
|
}
|
|
|
|
mRegCBMtx.unlock(); // MUTEX kioldás!!
|
|
}
|
|
|
|
mLastTimestamp = currentTime;
|
|
}
|
|
|
|
bool Timer::reg(const TimerCallbackData &tmrCBData) {
|
|
std::unique_lock<std::mutex> lock (mRegCBMtx); // MUTEX!!
|
|
|
|
if (mRegCallbacks.find(tmrCBData) == mRegCallbacks.end()) { //ha nincs benne az elem
|
|
mRegCallbacks.insert(tmrCBData);
|
|
return true;
|
|
}
|
|
|
|
// ha benne van
|
|
return false;
|
|
}
|
|
|
|
bool Timer::unreg(const TimerCallbackData &tmrCBData) {
|
|
std::unique_lock<std::mutex> lock (mRegCBMtx); // MUTEX!!
|
|
|
|
if (mRegCallbacks.find(tmrCBData) != mRegCallbacks.end()) { //ha benne van az elem, akkor töröljük
|
|
mRegCallbacks.erase(tmrCBData);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void Timer::setTriggerTime(const double &triggerTime) {
|
|
mTriggerTime = triggerTime;
|
|
}
|
|
|
|
double Timer::getTriggerTime() const {
|
|
return mTriggerTime;
|
|
}
|
|
|
|
double Timer::getElapsedTime() const {
|
|
return mTimeElapsed;
|
|
}
|
|
|
|
//-----------------------------------------------------------------
|
|
|
|
bool TimerCallbackData::operator<(const TimerCallbackData &other) const {
|
|
return callBackFn < other.callBackFn;
|
|
}
|
|
}
|