Wie genau ist QTimer?

Alles rund um die Programmierung mit Qt
Antworten
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Wie genau ist QTimer?

Beitrag von m-obi »

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?
Gruß m-obi
veeman
Beiträge: 280
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Wie genau ist QTimer?

Beitrag von veeman »

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.
m-obi
Beiträge: 18
Registriert: 14. August 2013 07:46

Re: Wie genau ist QTimer?

Beitrag von m-obi »

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.
Gruß m-obi
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Wie genau ist QTimer?

Beitrag von RHBaum »

und schon läuft es wie es soll. Bei 5 Sekunden hat man +- 50ms. Das ist in Ordnung.
DU solltest dich aber generell nicht drauf verlassen !
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 ....
Antworten