2010/5/30 Johnny Rosenberg <[email protected]>:
> 2010/5/30 Bernard Marcelly <[email protected]>:
>> Message de Konstantin Tokarev date 2010-05-29 19:10 :
>>>
>>>> On MS-Windows the result is in milliseconds, with a precision of 16 ms
>>>> due to IBM PC hardware design.
>>>
>>> Does it mean that results of OOo Basic scripts may be platform-dependent?
>>>
>>
>> Help says it depends on OS. I have not tested on other OS than MS-Windows,
>> nor on other HW platform, e.g. Mac.
>> Help shows how to count the ticks for a given delay.
>>
>> This code shows on PC/MS-Windows that GetSystemTicks does not increment by
>> 1.
>>
>> Dim t1 As Long, t2 As Long, n As Long
>> n = 0
>> t1 = GetSystemTicks
>> Do
>> t2 = GetSystemTicks -t1
>> n = n+1
>> Loop Until t2 <> 0
>> MsgBox("t2 = " & t2 & " n = " & n)
>>
>> Regards
>> Bernard
>
>
> Maybe I was wrong about the getSystemTicks() function. It seems like
> it actually measures time in ms, not just CPU time. At least my
> experiments point in that direction:
>
> REM ***** BASIC *****
>
> Option Explicit
>
> Sub Main
> Dim t1 As Double, t2 As Double, n As Long, st as Long
> n=0
> t1=now()
> st=GetSystemTicks()
> Do
> t2=now()
> n=n+1
> Loop Until (t2-t1)*86400>=100 ' Approximately 100 seconds
> MsgBox("Ticks/s: " & GetSystemTicks()-st & chr(13) & _
> "Loop: " & n & chr(13) & "t1= " & t1 & chr(13) & _
> "t2= " & t2 & chr(13) & "t2-t1= " & t2-t1 & _
> chr(13) & "In s: " & (t2-t1)*86400)
> End Sub
>
> Maybe something is wrong with my code, because sometimes it runs for
> an extra second. Run it in just one second instead of 100:
>
> REM ***** BASIC *****
>
> Option Explicit
>
> Sub Main
> Dim t1 As Double, t2 As Double, n As Long, st as Long
> n=0
> t1=now()
> st=GetSystemTicks()
> Do
> t2=now()
> n=n+1
> Loop Until (t2-t1)*86400>=1 ' One second only
> MsgBox("Ticks/s: " & GetSystemTicks()-st & chr(13) & _
> "Loop: " & n & chr(13) & "t1= " & t1 & chr(13) & _
> "t2= " & t2 & chr(13) & "t2-t1= " & t2-t1 & _
> chr(13) & "In s: " & (t2-t1)*86400)
> End Sub
>
> Now the ticks result should be somewhere between 0 and 999, right? It
> usually is, but now and then it's almost 2000. The n variable tells us
> how many times it looped, like in your example above, and it runs
> quite a few times for one tick, so why doesn't it realize that it's
> time to stop until (t2-t1)*86400 almost reaches 2?
> Yes, a bit out of topic, I know, but still interesting to know…
>
> For example one of the outputs is like this:
> Ticks/s: 1605
> Loop: 43638
> t1= 40328,4520717593
> t2= 40328,4520949074
> t2-t1= 2,31481462833472E-05
> In s: 1,99999983888119
>
> Why didn't it stop until (t2-t1)*86400≈2? It should have been ⩾1
> thousands of times before that, shouldn't it?
>
> Johnny Rosenberg
>
Figured it out…
REM ***** BASIC *****
Option Explicit
Sub Main
Dim t1 As Double, t2 As Double, t2old as Double
Dim n As Long, nold as Long, st as Long
n=0
t1=now()
st=GetSystemTicks()
Do
t2old=t2
t2=now()
nold=n
n=n+1
Loop Until (t2-t1)*86400>=1
MsgBox("Ticks/s: " & GetSystemTicks()-st & chr(13) & _
"Loop: " & n & chr(13) & "t1= " & t1 & chr(13) & _
"t2= " & t2 & chr(13) & "t2-t1= " & t2-t1 & _
chr(13) & "In s: " & (t2-t1)*86400 & chr(13) & _
chr(13) & "Loop-1: " & nold & chr(13) & _
"t2old= " & t2old & chr(13) & "t2old-t1= " & _
t2old-t1 & chr(13) & "In s: " & (t2old-t1)*86400)
End Sub
Due to precision error (t2-t1)*86400 is almost never an integer.
Sometimes it is something.00000something and sometimes it is
something.99999something, so of it after one second is 0.9999993568 it
is not ⩾1 so it loops a couple of thousands times more until it reach
the next step which is something like 1,99999993543…
Easy fixed by rounding the result of (t2-t1)*86400 to 0 decimals, I
think. Even easier to do something like this, though:
REM ***** BASIC *****
Option Explicit
Sub Main
Dim t1 As Double, t2 As Double, t2old as Double
Dim n As Long, nold as Long, st as Long
n=0
t1=now()
st=GetSystemTicks()
Do
t2old=t2
t2=now()
nold=n
n=n+1
Loop Until (t2-t1)*86400>0.9
MsgBox("Ticks/s: " & GetSystemTicks()-st & chr(13) & _
"Loop: " & n & chr(13) & "t1= " & t1 & chr(13) & _
"t2= " & t2 & chr(13) & "t2-t1= " & t2-t1 & _
chr(13) & "In s: " & (t2-t1)*86400 & chr(13) & _
chr(13) & "Loop-1: " & nold & chr(13) & _
"t2old= " & t2old & chr(13) & "t2old-t1= " & _
t2old-t1 & chr(13) & "In s: " & (t2old-t1)*86400)
End Sub
Johnny Rosenberg
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]