Morgen,
und wieder muss ich euch mal belästigen.
Unzwar verwende ich QTimer um alle 20ms einen Zähler hochzuzählen.
Nur anscheinend sind es nicht immer (bzw. nie genau) 20ms.
Wenn ich mit QElapsedTimer messe kommen Werte von 32, 28, 29, 34, 32, 49, 10,
37, 24, 34, 27 ms raus.
Gibt es evtl. einen genaueren Timer?
Wie genau ist QTimer?
Re: Wie genau ist QTimer?
Du kannst unter Windows nicht "genau" die Zeit messen, da dass meisten Architekturbedingt Eventbasierend ist.
(Auch anderen Systemen wie Linux ist das nur bedingt möglich.)
Dh. der Timer kriegt nach ca. 20ms vom System ein Event gesendet und wird erst zum nächstmöglichen Zeitpunkt ausgeführt.
Eben wenn der Context zum Ausführen an das Programm wieder übergeben wird.
Auch die von QElapsedTimer gelieferte Zeit ist nicht genau, im Sinne der Abhängigkeit des Prozessortakts.
Je nach Anwendung sollte es aber ausreichend sein wenn du anhand dieser Zeit (QElapsedTimer) die Zählweite ausrechnest.
(Auch anderen Systemen wie Linux ist das nur bedingt möglich.)
Dh. der Timer kriegt nach ca. 20ms vom System ein Event gesendet und wird erst zum nächstmöglichen Zeitpunkt ausgeführt.
Eben wenn der Context zum Ausführen an das Programm wieder übergeben wird.
Auch die von QElapsedTimer gelieferte Zeit ist nicht genau, im Sinne der Abhängigkeit des Prozessortakts.
Je nach Anwendung sollte es aber ausreichend sein wenn du anhand dieser Zeit (QElapsedTimer) die Zählweite ausrechnest.
Re: Wie genau ist QTimer?
Danke schonmal.
Wie könnte ich denn das ganze per Signal/Slot machen wie bei QTimer mit timeout()?
Edit:
Ok ich habs doch gelöst mit QTimer. Einfach
timer->setTimerType(Qt::PreciseTimer);
und schon läuft es wie es soll. Bei 5 Sekunden hat man +- 50ms. Das ist in Ordnung.
Trotzdem Danke.
Wie könnte ich denn das ganze per Signal/Slot machen wie bei QTimer mit timeout()?
Edit:
Ok ich habs doch gelöst mit QTimer. Einfach
timer->setTimerType(Qt::PreciseTimer);
und schon läuft es wie es soll. Bei 5 Sekunden hat man +- 50ms. Das ist in Ordnung.
Trotzdem Danke.
Gruß m-obi
Re: Wie genau ist QTimer?
DU solltest dich aber generell nicht drauf verlassen !und schon läuft es wie es soll. Bei 5 Sekunden hat man +- 50ms. Das ist in Ordnung.
Lass mal den virenscanner per volle suche im Vordergrund laufen, windows updater, den prime CPU test auf allen cores und log nebenher aufn anderen account auf der maschine ein ^^
Dann ist nix mehr mit +-50 ms, dann koennens auch +- 50 sek sein
Du bekommst beim "Normalen" OS keine genauen timer ... egal mit welcher Methode ...
Die einzige Möglichkeit ist nen Echtzeitbetriebssystem. Da bekommst auch zu definierten Intervallen garantiert den Focus und drafst code ausführen (als echtzeitmodul).
aber 50 ms sicher ned ^^ und QTimer funkt da auch ned anders.
Unabhaengig vom Processor Scope werden timerevents in die Nachrichtenschleife gehangen ... und wenn in der nen Aufruf drinhängt der lange blockiert, wars das dann auch wieder.
etwas genauere timer die nur vom Prozessorscope abhaengig sind, gehen nur ueber Threading ... und Qtimer ist nur der billige ersatz dafür (und erspart dir ne Menge Aufwand ).
nachteil (oder sidenote) , man kann selber dern eigenen timer toll ausbremsen ....
Also auf die Timerintervalle nie verlassen, die sorgen nur dafuer das ab und an mal den focus bekommst.
die "korrekten" aktuelle zeit musst dir eh nachkorrigeren, wenn für messaufgaben oder timestamps etc ...
das machst am besten mit dem Processorzähler (aka multimedia timer, Querperformancecounter ... etc)
QElapsedTimer macht das ja impliziet schon ...
Ciao ....