Seite 1 von 3
ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 09:35
von SilverSurfer
Hallo Leute,
ich möchte das sich ein Objekt in einer vorgegebenen Zeit um einem bestimmten Winkel (Diffangel) dreht.
Ich habe nun das Problem das bei mir count = 128 am Schluss raus kommt und ich müsste doch 179 erhalten,
oder spinne ich ?
Vielen Dank schonmal für eure Antworten.....
Code: Alles auswählen
DisableDebugger
EnableExplicit
Define Diffangle.f = 179 ;Winkel um die sich das Objekt drehen soll
Define StepTime.f = 4000/Diffangle; in 4 Sekunden
Define Time2.f = 0
Define count.l = 0
Define Time.f = ElapsedMilliseconds()+ 4000
Repeat
If ElapsedMilliseconds() >= Time2
count + 1
Time2 = ElapsedMilliseconds() + StepTime
EndIf
Until ElapsedMilliseconds() >= Time
EnableDebugger
Debug "Count = " + Str(count)
Debug StrF(StepTime)
Debug"-------------------------"
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 10:12
von Chimorin
Heyho,
ich hätte das so gelöst:
Code: Alles auswählen
EnableExplicit
Define Diffangle.f = 2 ;Winkel um die sich das Objekt drehen soll
Define StepTime.i = 4000/Diffangle; in 4 Sekunden
Define Time2.d = ElapsedMilliseconds()
Define.i Time = ElapsedMilliseconds()
Define count.i = 0
Define.d tt1
tt1 = ElapsedMilliseconds()
Repeat
If ElapsedMilliseconds() >= Time2 + StepTime
count + 1
Time2 = Time + count * StepTime
EndIf
Until count = diffangle
Debug ElapsedMilliseconds() - tt1
Debug "Count = " + Str(count)
Debug"-------------------------"
Bei mir werden auf jeden Fall die 179° gemacht, bei dir liegt der Fokus auf den 4 Sekunden Laufzeit. Sind bei dir 4 Sekunden um, bricht das Programm automatisch ab.
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 10:44
von SilverSurfer
Vielen Dank, so könnte es klappen.
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 13:11
von SilverSurfer
Obwohl ich es nicht wirklich verstehe. Einen kleinen Unterschied könnte ich mir ja erklären, aber nach vier Sekunden sollte doch die 179 ereicht sein. Wenn da count erst einen Wert von 128 hat, läuft ja was schief.
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 13:54
von HeX0R
Überleg doch mal:
ElapsedMilliseconds() gibt ein Integer zurück.
Du vergleichst das mit einem Float.
Steptime = 22,346
Bei einer If-Abfrage If INTEGER >= FLOAT wird das FLOAT wie ein INTEGER behandelt, d.h. die Nachkommastellen werden irrelevant.
Beispiel:
Code: Alles auswählen
i.i = 10000
f.f = 10000.236 ;<- ist eigentlich größer als i
If i >= f
Debug "ja wie?"
EndIf
D.h. Dein Counter erhöht sich nicht alle 22,346ms sondern alle 22ms.
4000 / 22 => 182
Das kommt auch bei mir raus, ich denke Deine 128 sind ein Zahlenverdreher?
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 14:21
von NicTheQuick
Wenn du das mit mehreren Werten machen möchtest, kannst du dir auch Hilfsfunktionen dafür schreiben.
Code: Alles auswählen
EnableExplicit
Structure LinearMove
xStart.d
xEnd.d
xDelta.d
timeStart.i
timeDelta.i
EndStructure
Global NewList LinearMoves.LinearMove()
Procedure.i LinearStart(xStart.d, xEnd.d, time.i)
If (AddElement(LinearMoves()))
With LinearMoves()
\xStart = xStart
\xEnd = xEnd
\xDelta = xEnd - xStart
\timeStart = ElapsedMilliseconds()
\timeDelta = time
EndWith
ProcedureReturn @LinearMoves()
EndIf
EndProcedure
Procedure.i LinearRunning(*linearMove.LinearMove)
With *linearMove
ProcedureReturn Bool(ElapsedMilliseconds() <= \timeStart + \timeDelta)
EndWith
EndProcedure
Procedure.d LinearGet(*linearMove.LinearMove)
Protected xPos.d
With *linearMove
If (LinearRunning(*linearMove))
ProcedureReturn \xStart + \xDelta * (ElapsedMilliseconds() - \timeStart) / \timeDelta
Else
ProcedureReturn \xEnd
EndIf
EndWith
EndProcedure
Procedure LinearStop(*linearMove.LinearMove)
ChangeCurrentElement(LinearMoves(), *linearMove)
DeleteElement(LinearMoves())
EndProcedure
; Lasse einen Wert linear von 0 bis 179 innerhalb von 4 Sekunden laufen
Define *a = LinearStart(0, 179, 4000)
Define *b = LinearStart(200, 100, 2000)
While LinearRunning(*a) Or LinearRunning(*b)
Debug "a=" + StrD(LinearGet(*a), 4) + " b=" + StrD(LinearGet(*b))
Delay(100)
Wend
Debug "a=" + StrD(LinearGet(*a), 4) + " b=" + StrD(LinearGet(*b))
LinearStop(*a)
LinearStop(*b)
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 17:33
von SilverSurfer
Nein, ich habe keinen Zahlendreher drinnen. Bei mir wird count nur bis zwischen 125 und 129 hochgezählt.
Wenn du meinen ersten Code bei dir laufen lässt, was bekommst du denn angezeigt?
Wenn ich diesen Code laufen lasse, habe ich eine Laufzeit von über 5,5 Sekunden.
Code: Alles auswählen
DisableDebugger
EnableExplicit
Define Diffangle.d = 179 ;Winkel um die sich das Objekt drehen soll
Define StepTime.d = 4000/Diffangle; in 4 Sekunden
Define Time2.d = 0
Define count.l = 0
Define Time.d = ElapsedMilliseconds()+ 4000
Repeat
If ElapsedMilliseconds() >= Time2
count + 1
Time2 = ElapsedMilliseconds() + 22
EndIf
Until count = Diffangle;ElapsedMilliseconds() >= Time
EnableDebugger
Debug "Zeit " + Str(ElapsedMilliseconds()- Time + 4000 )
Debug "Count = " + Str(count)
Debug StrF(StepTime)
Debug"-------------------------"
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 17:49
von NicTheQuick
Dieser Code gibt mir das hier aus:
Zeit 3916
Count = 179
22.3463687897
-------------------------
Dein Problem ist vielleicht, dass du 'ElapsedMilliseconds()' zwei mal aufrufst. Das musst du aber nur einmal:
Code: Alles auswählen
DisableDebugger
EnableExplicit
Define Diffangle.d = 179 ;Winkel um die sich das Objekt drehen soll
Define StepTime.d = 4000/Diffangle; in 4 Sekunden
Define Time2.d = 0
Define count.l = 0
Define Time.d = ElapsedMilliseconds()+ 4000
Repeat
If ElapsedMilliseconds() >= Time2
count + 1
Time2 + 22
EndIf
Until count = Diffangle;ElapsedMilliseconds() >= Time
EnableDebugger
Debug "Zeit " + Str(ElapsedMilliseconds()- Time + 4000 )
Debug "Count = " + Str(count)
Debug StrF(StepTime)
Debug"-------------------------"
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 18:05
von SilverSurfer
Ok, Wenn ich das so mache funktioniert das bei mir auch. Verstehe das trotzdem nicht, was ist denn verkehrt daran ElapsedMilliseconds()
zweimal aufzurufen ?
Re: ElapsedMilliseconds() Problem ?
Verfasst: 12.07.2015 18:11
von STARGÅTE
Hab den Thread nicht voll gelesen, aber beim zweiten Aufruf hat ElapsedMilliseconds() bereits einen anderen (höheren) Wert.
Somit wird Time2 nicht immer um 22ms erhöht, sondern u.u. um 23 oder 24, wenn ElapsedMilliseconds() nach der If-Abfrage schon wieder 1 oder 2ms weiter ist.