So jetzt erst mal alle zu ruhe kommen
1. Ich hab mich leider in der Thread-Überschrift nicht präzise genug ausgedrückt.
Mein Ziel ist es meinen Counter mit 100ms-Genauigkeit Events abfeuern zu lassen. Mir geht es nicht darum ein Zeitintervall möglichst auf Mikrosekunden zu messen, sondern, dass die Events wirklich rechtzeitig kommen. Und das auch noch nach 10 Minuten.
Hintergrund: Das Programm ist ein Übungsprogramm für Gedächtnismeister, die sich Zahlen merken und damit auf Meisterschaften gehen. Solche Leude:
http://www.memoriade.net/. Es generiert Zufallszehlen und sollte bis zu einer Geschwindigkeit von 100ms zuverlässig funktionieren.
Wenn Die mit dem Programm üben und 'n Rekord aufstellen und dann auf die Meisterschaft gehen und merken: "mist das Programm hat mir nicht die richtigen Zeiten ausgegeben" ist das sch.... .
Und da gehts tatsächlich manchmal um Millisekunden. (Für Weltrekorde usw.)
2. Ich finde es sehr komisch, dass Leute einfach drauflosreden ohne sich das Testprojekt mal angeschaut zu haben. Ich hab doch extra ein Projekt in den Anhang gesteckt. Da kann man doch mal kurz reinschauen oder einfach mal schnell kompilieren bevor man mitredet und irgendwelche "Halbwahrheiten" kreirt.
Für alle die dafür keine Zeit haben, hab ich extra die Funktion die aufgerufen wird "labelUpdaten()" genannt. Die mach eigentlich nichts anderes als einen integer erhöhen und das Label upzudaten
3. Also die Aussagen von Uwe sind am präzisesten.
Wenn das Abarbeiten eines der vorherigen Events lange dauert ( z.B irgendein aufwändiges Zeichnen ) kann so ein QTimeEvent sogar viel zu spät kommen.
Genau das ist anscheinend der kritische Punkt: Das Neuzeichnen!
Ich hab das ganze (wie franzf) jetzt auch mal mit einer Ubuntu 8.10 LiveCD getestet. Und siehe da: Sogar nach 30 min läuft alles rund auf 1ms genau.
Was mir auch aufgefallen ist, wenn man die Fenstergröße in Windows ändert friert der Counter auch kurzfristig ein.
Das beste wird also tatsächlich die schon von Uwe beschriebene Methode sein, um das ganze für Windows brauchbar zu machen:
Wenn man halbwegs genaue Intervalle benötigt ( z.B zum Abgreifen von Werten an externen Schnittstellen ) würde ich eine eigenen Thread empfehlen und dort ausschliesslich mit Betriebssytemaufrufe arbeiten.
Danke!
4. @Christian81
Die Timer werden alle korrekt abgehandelt, wenn er einen Event-Stau provoziert indem er die Eventloop nie aufruft... naja
Das ist im endeffekt jetzt genau der Knackpunkt. Windows schafft das Neuzeichnen nicht , Linux schon. Habsogar grad mal ein 1ms intervall getestet. während Windows krampfhaft versucht der Darstellung nachzukommen läuft in Linux alles astrein.
Was würdest du denn dagegen machen???