22 #ifndef CTKHIGHPRECISIONTIMER_H 23 #define CTKHIGHPRECISIONTIMER_H 28 #undef _ctk_use_high_precision_timer_fallback 31 #include <mach/mach_time.h> 32 #elif defined(Q_OS_UNIX) 35 #ifndef _POSIX_MONOTONIC_CLOCK 36 #warning Monotonic clock support missing on this POSIX platform 37 #define _ctk_use_high_precision_timer_fallback 39 #elif defined(Q_OS_WIN) 42 #define _ctk_use_high_precision_timer_fallback 45 #ifdef _ctk_use_high_precision_timer_fallback 46 #warning ctkHighPrecisionTimer is using the slower QTime fallback 76 static double timeConvert;
78 #ifdef _ctk_use_high_precision_timer_fallback 80 #elif defined(Q_OS_MAC) 82 #elif defined(Q_OS_UNIX) 84 #elif defined(Q_OS_WIN) 85 LARGE_INTEGER timerFrequency;
86 LARGE_INTEGER startTime;
90 #ifdef _ctk_use_high_precision_timer_fallback 93 : startTime(QTime::currentTime())
99 startTime = QTime::currentTime();
104 return startTime.elapsed();
109 return startTime.elapsed() * 1000;
112 #elif defined(Q_OS_MAC) 117 if (timeConvert == 0)
119 mach_timebase_info_data_t timeBase;
120 mach_timebase_info(&timeBase);
121 timeConvert = static_cast<double>(timeBase.numer) / static_cast<double>(timeBase.denom) / 1000.0;
127 startTime = mach_absolute_time();
132 quint64 current = mach_absolute_time();
133 return static_cast<double>(current - startTime) * timeConvert / 1000.0;
138 quint64 current = mach_absolute_time();
139 return static_cast<double>(current - startTime) * timeConvert;
142 #elif defined(Q_OS_UNIX) 146 startTime.tv_nsec = 0;
147 startTime.tv_sec = 0;
152 clock_gettime(CLOCK_MONOTONIC, &startTime);
158 clock_gettime(CLOCK_MONOTONIC, ¤t);
159 return (static_cast<qint64>(current.tv_sec)*1000 + current.tv_nsec/1000/1000) -
160 (static_cast<qint64>(startTime.tv_sec)*1000 + startTime.tv_nsec/1000/1000);
166 clock_gettime(CLOCK_MONOTONIC, ¤t);
167 return (static_cast<qint64>(current.tv_sec)*1000*1000 + current.tv_nsec/1000) -
168 (static_cast<qint64>(startTime.tv_sec)*1000*1000 + startTime.tv_nsec/1000);
171 #elif defined(Q_OS_WIN) 177 if (!QueryPerformanceFrequency(&timerFrequency))
184 QueryPerformanceCounter(&startTime);
190 LARGE_INTEGER current;
191 QueryPerformanceCounter(¤t);
192 return (current.QuadPart - startTime.QuadPart) / (timerFrequency.QuadPart / 1000);
197 LARGE_INTEGER current;
198 QueryPerformanceCounter(¤t);
199 return (current.QuadPart - startTime.QuadPart) / (timerFrequency.QuadPart / (1000*1000));
204 #endif // CTKHIGHPRECISIONTIMER_H
A fast and high precision timer.