// // 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 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 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; } }