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)
27 long QueryPerformanceCounter(currency lpPerformanceCount);
28 long QueryPerformanceFrequency(currency lpFrequency);
30 boolean DelayLoopActive;
32 boolean MPause, bHighPerf;
33 currency PFreq; // LARGE_INTEGER
34 double sFactor, msFactor, usFactor;
36 boolean TickCountObject_Get_Active()
40 Active = DelayLoopActive;
45 boolean TickCountObject_Get_Pause()
54 void TickCountObject_Let_Pause(boolean NewVal)
59 void TickCountObject_DelayMS(long MSInterval, boolean DoEventsFlag) // in ms
63 Start = TickCountObject_Get_TickNow();
64 DelayLoopActive = True;
70 if (MSInterval <= TickCountObject_TickDiffMS(Start) && ! MPause)
75 DelayLoopActive = False;
78 // for compatibility with old code:
79 void TickCountObject_DelayS(long SInterval, boolean DoEventsFlag) // in s
81 // check if SInterval is less than 25 days ...
82 if ((int)(LongMax / 1000) <= SInterval)
84 Err.Raise(513, "Delay()", "Value Overflow");
88 TickCountObject_DelayMS((long)1000 * SInterval, DoEventsFlag);
92 currency TickCountObject_Get_TickNow()
98 QueryPerformanceCounter(TickNow);
102 TickNow = GetTickCount();
108 long TickCountObject_TickDiffS(currency TickStart)
112 currency NewTick, TD;
116 QueryPerformanceCounter(NewTick);
117 TD = (NewTick - TickStart);
118 TickDiffS = sFactor * TD;
122 NewTick = GetTickCount();
123 if (NewTick < TickStart)
125 // Overflow occured and needs to be handled
126 TickDiffS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
130 TickDiffS = NewTick - TickStart;
133 TickDiffS = (int)(TickDiffS / 1000);
139 long TickCountObject_TickDiffMS(currency TickStart)
143 currency NewTick, TD;
147 QueryPerformanceCounter(NewTick);
148 TD = (NewTick - TickStart);
149 TickDiffMS = msFactor * TD;
153 NewTick = GetTickCount();
154 if (NewTick < TickStart)
156 // Overflow occured and needs to be handled
157 TickDiffMS = (LongMax - TickStart) + (NewTick - LongMin) + 1;
161 TickDiffMS = NewTick - TickStart;
168 currency TickCountObject_TickDiffUS(currency TickStart)
172 currency NewTick, TD;
176 QueryPerformanceCounter(NewTick);
177 TD = (NewTick - TickStart);
178 TickDiffUS = usFactor * TD;
182 NewTick = GetTickCount();
183 if (NewTick < TickStart)
185 // Overflow occured and needs to be handled
186 TickDiffUS = ((LongMax - TickStart) + (NewTick - LongMin) + 1) * (currency)1000;
190 TickDiffUS = (NewTick - TickStart) * (currency)1000;
199 static void Class_Initialize()
203 bHighPerf = (0 != QueryPerformanceFrequency(PFreq));
206 sFactor = (double)1 / PFreq;
207 msFactor = (double)1000 / PFreq;
208 usFactor = (double)1000000 / PFreq;
211 DelayLoopActive = False;
212 TickCountObject_Let_Pause(False);