Seite 1 von 1

Allgemeine Fragen zu QTimer

Verfasst: 25. Juli 2007 10:54
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

Verfasst: 25. Juli 2007 12:53
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 ...

Verfasst: 25. Juli 2007 13:10
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).

Verfasst: 26. Juli 2007 10:14
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 ...