>>dt0=DTOT(DATE()) >>dt1=DATETIME() >>dt2=m.dt1+0.643 >>? 0.000+(dt2-dt1) >>CREATE CURSOR AA (T1 T , T2 T ) >>INSERT INTO AA VALUES (dt1,dt2) >>? 0.000+(t2-t1) >>>>
>* instead of just calling DATETIME( ), use >ltDateTime = DATETIME( ) + MOD( SECONDS( ), 1 ) >>Both seem to work reasonably well. Here's some test code:
>LPARAMETERS ; > tlUseTickCount > >* Parameters: >* .T. to run the test using the GetTickCount( ) API call >* .F. to run the test appending MOD( SECONDS( ), 1 ) to DATETIME( ) calls > >* Takes about 25 seconds to run with loop count and maximum sleep time as below > >LOCAL ; > ltStart ; > , ltEnd ; > , lnIx ; > , lnmSecSleep ; > , lnStart ; > , lnEnd ; > , lnmSecSleepMax > >m.lnmSecSleepMax = 500 > >* mSecSleep = milliseconds execution pauses using Sleep API call >* mSecDiff = milliseconds time difference between "start" and "end" times >* in a perfect world, that would be exactly equal to mSecSleep >* mSecOHead = milliseconds overhead, the amount of time that the difference >* between the "start" and "end" times exceeds the Sleep time >CREATE CURSOR Test ; > ( mSecSleep I ; > , mSecDiff I ; > , mSecOHead I ) > >DECLARE Sleep IN kernel32 INTEGER dwMilliseconds >DECLARE INTEGER GetTickCount IN kernel32 > >=RAND( -1 ) > >FOR m.lnIx = 1 TO 100 STEP 1 > * Set a random sleep duration: > m.lnmSecSleep = INT( RAND( ) * m.lnmSecSleepMax ) > > IF m.tlUseTickCount > m.lnStart = GetTickCount( ) > =Sleep( m.lnmSecSleep ) > m.lnEnd = GetTickCount( ) > > INSERT INTO Test ; > ( mSecSleep ; > , mSecDiff ; > , mSecOHead ) ; > VALUES ; > ( m.lnmSecSleep ; > , m.lnEnd - m.lnStart ; > , ( m.lnEnd - m.lnStart ) - m.lnmSecSleep ) > > ELSE > m.ltStart = DATETIME( ) + MOD( SECONDS( ), 1 ) > =Sleep( m.lnmSecSleep ) > m.ltEnd = DATETIME( ) + MOD( SECONDS( ), 1 ) > > INSERT INTO Test ; > ( mSecSleep ; > , mSecDiff ; > , mSecOHead ) ; > VALUES ; > ( m.lnmSecSleep ; > , 1000 * ( m.ltEnd - m.ltStart ) ; > , ( 1000 * ( m.ltEnd - m.ltStart ) ) - m.lnmSecSleep ) > > ENDIF > >ENDFOR > >BROWSE NOWAIT >>I think I like the SECONDS( ) approach better. With that the results can be stored in a regular DateTime column.
CLEAR FOR k=1 TO 1000000 IF INT(SECONDS())#DATETIME()-DTOT(DATE()) && This should always be true ? SECONDS(),DATETIME(),DATETIME()-DTOT(DATE()) ENDIF NEXT