# [C++] Zeitmessung in Millisekunden



## Jellysheep (27. Mai 2010)

Hi, 
mit diesem Code aus einer onTimer()-Funktion versuche ich, eine gleichmäßige Drehung zu ermöglichen:

```
akt_tick = timeGetTime();
tick_diff = akt_tick-tick;
glRotatef((spin++)*tick_diff, 0.0, 1.0, 0.0);  
tick = akt_tick;
//weiterer Code
```
Die Drehung ist am Anfang super, nach ein paar Sekunden springt es aber immer wilder. 
Woran liegt das?

//EDIT
Ich verwende VC++ auf Windows


----------



## Matthias Reitinger (27. Mai 2010)

Hallo Jellysheep,



Jellysheep hat gesagt.:


> ```
> glRotatef((spin++)*tick_diff, 0.0, 1.0, 0.0);
> ```


Was genau soll hier passieren? Welchen Zweck hat (spin++)?

Grüße,
Matthias


----------



## Jellysheep (27. Mai 2010)

Das ist die Drehung des Objektes:

```
onTimer(){
  zeichneHintergrund();
  drehePerspektive(spin++);
  zeichneObjekt();
}
```


----------



## Matthias Reitinger (27. Mai 2010)

Jellysheep hat gesagt.:


> Das ist die Drehung des Objektes:
> 
> ```
> onTimer(){
> ...


Was hat dieser (Pseudo?-)Code jetzt mit dem obigen Ausschnitt zu tun? Oder nochmal genauer nachgefragt: was erwartest du, dass der Ausdruck (spin++)*tick_diff ergeben sollte?

Grüße,
Matthias


----------



## Cromon (28. Mai 2010)

Wenn hier noch die Rede von Zeitmessung ist und ich sehe, dass es mit OpenGL um eine Zeichenapplikation geht gehe ich davon aus, dass du gerne eine regelmässige Verteilung hättest, daher ist dieser Artikel sicher auch interessant:
http://algo2.iti.kit.edu/wassenberg/timing/timing_pitfalls.pdf


----------



## Jellysheep (28. Mai 2010)

Matthias Reitinger hat gesagt.:


> Was hat dieser (Pseudo?-)Code jetzt mit dem obigen Ausschnitt zu tun?


Das ist eine gescheiterte Erklärung des Problems. 

Ich versuchs nochmal:
Eine onTimer()-Methode wird mittels setTimer() etwa alle 40ms aufgerufen, ein Objekt wird jeweils um einen bestimmten Winkel gedreht. 
Jetzt kann es sein, dass durch hohe CPU-Auslastung nur alle 45ms aktualisiert wird. 
In dem Fall soll sich das Objekt ein bisschen schneller drehen, um die Verzögerung auszugleichen. 
Dazu brauche ich aber den Zeitabstand zwischen den zwei Aufrufen von onTimer(). 
Der von mir gezeigte Code funktioniert aber nicht, da sich das Objekt immer hektischer vor- und zurückdreht. 
Warum passiert das?

@Cromon:
Danke für den Link, ich les es mir mal durch.


----------



## Cromon (28. Mai 2010)

Die Frage ist glaub eher was das spin++ da bewirken soll. 

Ich würde das folgendermassen machen:

```
...
float m_curentRotationInGrad = 0.0f;
...

void OnTimerUpdate()
{
         DWORD dwDiff = DeineZeitMessFunktion();
         m_currentRotationInGrad += dwDiff * RotationInGradProMillisekunde;
         if(m_currentRotationInGrad > 360.0f)
              m_currentRotationInGrad -= 360.0f;
         glRotatef(m_currentRotationInGrad, ....);
}
```


----------



## Jellysheep (28. Mai 2010)

Dankeschön, ich hab den Code von Cromon angewendet und dabei auch gleich meinen Fehler entdeckt. 
Positive Bewertung folgt.  


Noch eine Frage:
Kann ich einen "dynamischen" Timer erstellen, sprich die Frequenz im Nachhinein anpassen?
Ich denke, oft setTimer() und killTimer() aufzurufen macht keinen Sinn. 
Kann man das Intervall von setTimer noch einstellen, bzw. gibt es z.B. updateTimer()?


----------



## Jellysheep (1. Juni 2010)

Hi, 
braucht ein Multimedia-Timer mehr Rechenleistung als ein Timer mit setTimer() ?
Kann man beim Multimedia-Timer den Zeitabstand zwischen den Aufrufen einstellen, ohne den Timer zu beenden?


----------



## OnlyFoo (1. Juni 2010)

Mach dir mal keine Gedanken über die Rechenleistung für 'nen Timer, die ist vermutlich verschwindend gering  im Verhältnis zu deiner Anwendungslogik.


----------

