2020-02-29 10:33:37 +01:00

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 * ) &currentTime);
// 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;
}
}