Bewusste Verzögerung von Prozessen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Bewusste Verzögerung von Prozessen

Beitragvon numerix » Dienstag 25. März 2008, 17:49

Um eine graphische Animation darzustellen brauche ich eine absichtlich verzögerte Darstellung. Diese soll möglichst so realisiert werden, dass auf unterschiedlichen Rechnern und Betriebssystemen (insbesondere Linux und Windows) in etwa die gleiche Animationsgeschwindigkeit erzielt wird.

Meine bisherige Lösung sieht so aus, dass ich kleine Zeitverzögerungen einbaue. Auf meinem Linuxsystem kann ich mittels time.time() ausreichend kleine Zeitintervalle (im zweistelligen Mikrosekundenbereich) messen und das ganze so realisieren, wie ich es gerne hätte.

Nun kann man ja in der Dokumentation dazu nachlesen, dass time.time() auf unterschiedlichen Betriebssystemen durchaus wesentlich ungenauer sein kann. Auf einem Windowssystem kann ich es derzeit aber nicht testen.

Die Empfehlung der Doku - time.clock() - zu verwenden, entfällt für Linux.
Mit dem timeit-Modul habe ich es ebenfalls nicht in der gewünschten Genauigkeit realisieren können.

Die after()-Methode von Tkinter ist mit mind. 1 ms ebenfalls nicht zu gebrauchen.

Frage(n) also:
Ist die Idee mit den eingebauten Wartezeiten für die Animation an sich schlecht? Kann man das anders besser lösen?
Wenn es die beste Lösung ist: Ist time.clock() unter Windows genau genug, um die gewünschten kurzen Zeiten messen zu können?

Edit: time.sleep() habe ich natürlich auch getestet; ist aber zu träge bzw. ungenau, jedenfalls unter Linux.
Zuletzt geändert von numerix am Dienstag 25. März 2008, 21:43, insgesamt 1-mal geändert.
Holzdolph
User
Beiträge: 23
Registriert: Donnerstag 22. November 2007, 17:43

Beitragvon Holzdolph » Dienstag 25. März 2008, 19:02

wer bemerkt denn bitte eine verzögerung um max. 99E-6 sekunden ? wenn deine gesamte animation 1000 schritte hat hat sich die gesamte animationszeit um ~0.1s erhöht, und das für den worst case deiner 2stelligen verzögerung, also im mittel um etwa 0.05s.

wenn also jede mikrosekunde zählt, wozu dann überhaupt eine verzögerung einbauen. und falls doch nicht, kannst nicht an anderer stelle verzögern damit du nicht so kleine intervalle brauchst ?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Dienstag 25. März 2008, 19:35

Da eine annähernd "stufenlose" Regelung der Animationsgeschwindigkeit ermöglicht werden soll und die Animation gleichzeitig so flüssig wie möglich ablaufen soll, benötige ich einen möglichst kleinen Basiszeitraum, auf den ich mich stützen kann.

Verzögerungen unter 0.1 ms kann man durchaus wahrnehmen, wenn die Anzahl der Schritte groß genug ist. Aber viel ist das natürlich nicht, das hast du schon recht. Durch Multiplikation mit dem Basisfaktor ergeben sich dann auch Werte über 1 ms; aber dann ist es eben auch schon langsam.

Wie genau ist denn nun time.clock() unter windows?

Vielleicht könnte jemand folgendes mal unter Windows mit time.time() und time.clock() durchführen. Das wäre nett.

Code: Alles auswählen

>>> import time
>>> "%.3f ms" %(abs(time.time()-time.time())*1000)
'0.006 ms'


Korrektur zum letzten Posting: Mit timeit komme ich etwa auf 0.01 ms herunter.
Holzdolph
User
Beiträge: 23
Registriert: Donnerstag 22. November 2007, 17:43

Beitragvon Holzdolph » Dienstag 25. März 2008, 19:52

habs gerade ein paar mal durchgeführt, das gibt immer 0.0 ms zurück.

edit:
mit time.clock() funktionierts:

Code: Alles auswählen

>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00196 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00223 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00168 ms
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Dienstag 25. März 2008, 20:11

Vielen Dank, das hilft.

Kann es jemand mal mit Mac OS checken?
Mit time.time() und time.clock()? Das wäre nett.

Wer ist online?

Mitglieder in diesem Forum: WhiteyW