1 // ----------------------------------------------------------------------------
3 // ----------------------------------------------------------------------------
5 #include "TickCountObject.h"
7 // --- VERSION 1.0 CLASS
9 // --- MultiUse = -1 'True // True
10 // --- Persistable = 0 'NotPersistable // NotPersistable
11 // --- DataBindingBehavior = 0 'vbNone // vbNone
12 // --- DataSourceBehavior = 0 'vbNone // vbNone
13 // --- MTSTransactionMode = 0 'NotAnMTSObject // NotAnMTSObject
16 // static char *VB_Name = "TickCountObject";
17 // static boolean VB_GlobalNameSpace = False;
18 // static boolean VB_Creatable = True;
19 // static boolean VB_PredeclaredId = False;
20 // static boolean VB_Exposed = False;
21 // --- Option Explicit
23 #define LongMin (-(double)2147483648UL) // the "#" sign is a bug of the VB environment AutoFormat function but causes no real problems; don't worry 'bout it!
24 #define LongMax (2147483647UL)
28 long MyGetTickCount();
29 long QueryPerformanceCounter(currency lpPerformanceCount);
30 long QueryPerformanceFrequency(currency lpFrequency);
34 boolean DelayLoopActive;
36 boolean MPause, bHighPerf;
37 currency PFreq; // LARGE_INTEGER
38 double sFactor, msFactor, usFactor;
42 boolean TickCountObject_Get_Active()
46 Active = DelayLoopActive;
51 boolean TickCountObject_Get_Pause()
60 void TickCountObject_Let_Pause(boolean NewVal)
65 void TickCountObject_DelayMS(long MSInterval, boolean DoEventsFlag) // in ms
69 Start = TickCountObject_Get_TickNow();
70 DelayLoopActive = True;
76 if (MSInterval <= TickCountObject_TickDiffMS(Start) && ! MPause)
81 DelayLoopActive = False;
84 // for compatibility with old code:
85 void TickCountObject_DelayS(long SInterval, boolean DoEventsFlag) // in s
87 // check if SInterval is less than 25 days ...
88 if ((int)(LongMax / 1000) <= SInterval)
90 Err.Raise(513, "Delay()", "Value Overflow");
94 TickCountObject_DelayMS((long)1000 * SInterval, DoEventsFlag);
98 currency TickCountObject_Get_TickNow()
104 QueryPerformanceCounter(TickNow);
108 TickNow = MyGetTickCount();
114 long TickCountObject_TickDiffS(currency TickStart)
118 currency NewTick, TD;
122 QueryPerformanceCounter(NewTick);
123 TD = (NewTick - TickStart);
124 TickDiffS = sFactor * TD;
128 NewTick = MyGetTickCount();
129 if (NewTick < TickStart)
131 // Overflow occured and needs to be handled
132 TickDiffS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
136 TickDiffS = NewTick - TickStart;
139 TickDiffS = (int)(TickDiffS / 1000);
145 long TickCountObject_TickDiffMS(currency TickStart)
149 currency NewTick, TD;
153 QueryPerformanceCounter(NewTick);
154 TD = (NewTick - TickStart);
155 TickDiffMS = msFactor * TD;
159 NewTick = MyGetTickCount();
160 if (NewTick < TickStart)
162 // Overflow occured and needs to be handled
163 TickDiffMS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
167 TickDiffMS = NewTick - TickStart;
174 currency TickCountObject_TickDiffUS(currency TickStart)
178 currency NewTick, TD;
182 QueryPerformanceCounter(NewTick);
183 TD = (NewTick - TickStart);
184 TickDiffUS = usFactor * TD;
188 NewTick = MyGetTickCount();
189 if (NewTick < TickStart)
191 // Overflow occured and needs to be handled
192 TickDiffUS = ((LongMax - TickStart) + (NewTick - LongMin) + 1) * (currency)1000;
196 TickDiffUS = (NewTick - TickStart) * (currency)1000;
207 static void Class_Initialize()
211 bHighPerf = (0 != QueryPerformanceFrequency(PFreq));
214 sFactor = (double)1 / PFreq;
215 msFactor = (double)1000 / PFreq;
216 usFactor = (double)1000000 / PFreq;
219 DelayLoopActive = False;
220 TickCountObject_Let_Pause(False);