OSDN Git Service

Several improvements and bug fixes.
[dennco/dennco.git] / Source / platform / qt / qtdntimekeeperimpl.cpp
index e9e2641..72a267f 100644 (file)
@@ -35,7 +35,7 @@ DNTimeKeeperImpl *DNTimeKeeperImpl::create()
     return new QtDNTimeKeeperImpl;
 }
 
-QtDNTimeKeeperImpl::QtDNTimeKeeperImpl() : mIntervalTime(1000),mAvgActualInterval(1000),mAdjustTime(0),mPrevTime(0),mStartTime(0),mTickTime(0)
+QtDNTimeKeeperImpl::QtDNTimeKeeperImpl() : mIntervalTime(1000),mAdjustTime(0),mPrevTime(0),mStartTime(0),mTickTime(0)
 {
 }
 
@@ -46,7 +46,6 @@ QtDNTimeKeeperImpl::~QtDNTimeKeeperImpl()
 bool  QtDNTimeKeeperImpl::setIntevalSec(float time)
 {
     mIntervalTime = time * 1000;
-    mAvgActualInterval = time * 1000;
     mAdjustTime = 0.0;
     return true;
 }
@@ -59,16 +58,19 @@ bool  QtDNTimeKeeperImpl::sleepUntilNextInterval()
     }
     qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
     qint64 dt = currentTime - mPrevTime;
-    qint64 wt = mIntervalTime + dt + (int)mAdjustTime;
-
-    if (wt < 5)  // wait at least 5ms.
+    qint64 wt = mIntervalTime - dt + (int)mAdjustTime;
+    if (wt < 1)  // wait at least 1ms.
     {
-        wt = 5;
+        wt = 1;
     }
     SleeperThread::msleep(wt);
     qint64 t = QDateTime::currentMSecsSinceEpoch();
-    mAvgActualInterval = (float)mAvgActualInterval * 0.9 + ((float)(t - mPrevTime) * 0.1);
-    mAdjustTime += (mIntervalTime - mAvgActualInterval);
+
+    mAdjustTime += mIntervalTime - (t - mPrevTime);
+    if (mAdjustTime < -mIntervalTime * 0.3)
+    {
+        mAdjustTime = -mIntervalTime * 0.3;
+    }
     mPrevTime = t;
 
     mTickTime = (mPrevTime - mStartTime)/1000.0;
@@ -85,7 +87,6 @@ bool QtDNTimeKeeperImpl::start()
 {
     mStartTime = QDateTime::currentMSecsSinceEpoch();
     mPrevTime = mStartTime;
-    mAvgActualInterval = mIntervalTime;
     mAdjustTime = 0.0;
     mTickTime = 0.0;
     return true;