Seite 1 von 1

QTimer und Slot

Verfasst: 24. Juli 2012 17:10
von redbulls
Hi, kurze grundlegende Frage:
Angenommen in einer Klasse gibt es einen timer(QTimer), der im Sekunden-Intervall das timeOut Signal sendet und dadurch einen Slot auslöst.
Was passiert, wenn die Abarbeitung des Slots aber 2 Sekunden benötigt?

danke

Re: QTimer und Slot

Verfasst: 24. Juli 2012 17:17
von Christian81
Dann stauen sich die Signals.
Wenn Du nach der Ausführung des Slots eine Sekunde warten willst dann empfiehlt sich QTimer::singleShot()

Re: QTimer und Slot

Verfasst: 24. Juli 2012 17:51
von redbulls
ok, ist verständlich.

danke für die schnelle hilfe = )

Re: QTimer und Slot

Verfasst: 26. Juli 2012 16:08
von Markus
Oder den Timer im Slot stoppen und wenn die Verarbeitung erledigt ist, den Timer wieder starten. :wink:

Re: QTimer und Slot

Verfasst: 27. Juli 2012 16:29
von RHBaum
Dann stauen sich die Signals.
Aber nur theorethisch ....
Praktisch:
Mit nem Timer verhinderst oft das threads erstellen musst ... also kann man davon fast immer ausgehen, das der Timer und dein Slot im Selben thread laufen ...
Blockst du aber im Slot den thread, durch intensives Rechnen, IO zugriffe etc ... dann kommt auch dein timer ned dazu, das signal "loszuwerden".
Das heisst, selbst nach 5 sek, wenn der timer den focus bekommt, kriegt der mit "Mensch ich haett scho laengst senden muessen" und tuts ... er holt aber die anderen 4 mal nicht nach ...
der naechste "shot" geht dann in wieder 1 sek raus.
Also bei dir saeh es so aus ... 1 sek, 2 sek (weil timer blockiert war), 1 sek .....

So verhaelt es sich zumindest bei uns unter windows ^^
WIe gesagt, bedingung, Timer und Slot in einem (GUI)thread ...

Ciao ...

Re: QTimer und Slot

Verfasst: 27. Juli 2012 17:11
von Christian81
Bist Du Dir da wirklich sicher? Das würde dem QTimer eigentlich widersprechen...

Re: QTimer und Slot

Verfasst: 7. August 2012 17:52
von RHBaum
Bist Du Dir da wirklich sicher?
Jupp ...
z.b. Windows XP 32, qt 4.6.4 dynamic build verhaelt sich definitiv so ... timer werden nicht "nachgeholt"

wir haben hier Views die haben aller 500ms nen Update (GUI Thread).
wenn ich durch nachladen ... und ja das tu ich ^^ ... den gui thread blockiere, teilweisse im minutenbereich, fallen die timer aus, klar ...
nachm laden kommen die wieder .... aber dann nicht 80-200 kurz hintereinander, sondern wieder gleich schoen im 500ms takt.

Keine ahnung wer das Umsetzt, ob die windows Queue (WM_TIMER) oder die QT event queue, oder ob der timer einfach nur nicht sich den focus holen kann um in die eventloop zu schreiben ...
muesste mir den qt code anschauen ....

btw mach ich nen OnProgress, welches im der App dann nen qApp->processEvents() aufruft ...
Dann kommen die timer zwischendurch aber unreglemaessig und nie doppelt / kurz hintereinander, sondern immer mit mindestens 500ms abstand ...

Ciao ...