ElapsedMilliseconds() Problem ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

ElapsedMilliseconds() Problem ?

Beitrag 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"-------------------------"


Benutzeravatar
Chimorin
Beiträge: 451
Registriert: 30.01.2013 16:11
Computerausstattung: MSI GTX 660 OC mit TwinFrozr III
6Gb DDR 3 RAM
AMD Phenom II X4 B55 @ 3,6GHz
Windows 7 Home Premium 64-bit

Re: ElapsedMilliseconds() Problem ?

Beitrag 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.
Bild

- formerly known as Bananenfreak -
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: ElapsedMilliseconds() Problem ?

Beitrag von SilverSurfer »

Vielen Dank, so könnte es klappen.
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: ElapsedMilliseconds() Problem ?

Beitrag 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.
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: ElapsedMilliseconds() Problem ?

Beitrag 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?
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ElapsedMilliseconds() Problem ?

Beitrag 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)
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: ElapsedMilliseconds() Problem ?

Beitrag 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"-------------------------"
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: ElapsedMilliseconds() Problem ?

Beitrag 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"-------------------------" 
SilverSurfer
Beiträge: 32
Registriert: 14.06.2015 10:23

Re: ElapsedMilliseconds() Problem ?

Beitrag 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 ?
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ElapsedMilliseconds() Problem ?

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten