Allgemeine Fragen zu QTimer

Alles rund um die Programmierung mit Qt
Antworten
LangerJan
Beiträge: 9
Registriert: 14. Juli 2007 23:34

Allgemeine Fragen zu QTimer

Beitrag von LangerJan »

Moin!

Ich hätte da ein paar Fragen zum QTimer und es wäre sehr nett, wenn dazu jemand eine Antwort für mich hätte.
Ich arbeite gerade daran, meinen Timer, der in einer QGraphicsScene alle 25ms Bewegungen/Updates von Items auslöst, zu verbessern.

Aus der Doku zu QTimer:
If Qt is unable to deliver the requested number of timer clicks, it will silently discard some.
Kennt vielleicht doch jemand einen Weg, um an die Zahl der übergangenen Klicks zu kommen?

Gibt es spürbare Unterschiede in der Performance zwischen
- QTimer
- QBasicTimer
- und QTimer::singleShot?

Besten Dank im Voraus!

Jan
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

wenn es dir auf genauigkeit ankommt, solltest du den "timerwerten" eh nicht vertrauen ...
sondern, sobald du den focus ueber den timer bekommst, die systicks selber nochmal auslesen auslesen und dir dann selber die verstrichene zeit ausrechnen .... unter windows : QuereyPerformanceCounter. wilkommen in der plattformabhaengigen welt ! (compiler direktiven sind dein freund ^^)

der timer ist ja dein multithreading ersatz .... sein nachteil, er kann nur ausgefuehrt werden, wenn dein mainthread in der idle schleife (windows queue) haengt. also wenn bei timer zeit grad wer zig microsekunden vorher nen buttun gedrueckt hat, wo was passiert, dann wird dein timerevent eh verzoegert ....

also zeiten nehmen , letzte zeit immer irgendwo speichern und mit den diffs arbeiten .... anders sollt man es eh nicht machen ....

selbst bei multithreading sollt man sich ned auf den scheduler verlassen ...

Ciao ...
LangerJan
Beiträge: 9
Registriert: 14. Juli 2007 23:34

Beitrag von LangerJan »

Hi und danke für deine Antwort :)

Mir kommts nicht unbedingt auf Genauigkeit an, ich möchte nur, dass mein Programm eine zuverlässige Anzahl von Klicks pro Sekunde durch den Timer bekommt (plus/minus eines Toleranzwertes).

Ich möchte mein Programm weiter abspecken, es soll weniger Zeit zum Ausführen der einzelnen Funktionen benötigt werden (damit er dann eben schneller wieder idle ist ;) )
Darum meine Frage, ob die Timer unterschiedlich viel Zeit benötigen (zur Not muss ich das wohl irgendwie ausmessen).
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Mir kommts nicht unbedingt auf Genauigkeit an, ich möchte nur, dass mein Programm eine zuverlässige Anzahl von Klicks pro Sekunde durch den Timer bekommt
Da ist nen timer in ner singlethread umgebung das wohl am wenigsten geeignete mittel ....

sobald irgend was aufwendigereres gestartet wurde, "verhungert" dein timer ...da kannst nix dran machen.

- alternative waere, die aufwendigere möglichkeit waere, die ziemlich langwierigen jobs zu zerhacken, damit sie ganz grob regelmaessig zeit fuer den timer freischaufeln koennen .... sehr ungenau, sehr aufwendig ....

- besser gehts dann schon mit multithreading, dh. du laesst das unterbrechen der jobs den BS scheduler zu .... d.h. du bekommst "releativ" genau vom BS scheduler rechenzeit fuer deine threads zugeteilt, dementsprechend genau kann dein timer werden.
Im 10x millisekunden bereich durchaus brauchbar ....
Ist halt dann vom systemzustand, den gestarteten programmen etc abhaengig .... das heisst programme mit hoeherer Prio und treiber / programme auf kernelebene koennen Dir immer noch dazwischen funken.

und je nach anzahl und prio der gestarteten prozesse werden die zeitabstaende und max zeitdauer, fuer den focus groesser / geringer ...

Kannst du damit auch nicht leben, helfen nur noch echtzeit BS ... dort kannst den scheduler selber konfigurieren, und du bekommst dann definitiv zu bestimmten zeiten deine rechenzeit ....

Fazit:
Unter windows/ standard linux verlass dich niemals auf timer ... zeiten selber messen ... sich das rtc register des prozessors holen(queryperformancecounter) kostet ned viel rechenzeit, und du weisst wo du grad bist .....

QTimer / QBasicTimer
Die doku ist recht duerftig .....
Welches BS faehrst du denn ?
Ich persoenlich glaub, das zumindest unter windows da kein grosser unterschied ist .... als Singlethread anwendung und wrapper der winapi, hat die QT nur die moeglichkeit, timer ueber die WM_TIMER funktionalitaet der fenster aufzubauen .... Vielleicht macht QTimer bisserl mehr QT intern als QBasicTimer, aber glaub ned das das wirklich ins gewicht faellt ....

Weiss ned ob Linux im X mehr ankermoeglichkeiten hat als in der windows api .... kann sein das es da mehr möglichkeiten gibt.

Ciao ...
Antworten