2012-09-27 11 views
7

Ho bisogno di un timer per essere attivato ogni 1 ms. This report di documenti, che l'invocazione di slot potrebbe essere molto più lenta di persino una chiamata di funzione virtuale.Qtimer vs timerEvent: quale di questi produce meno costi generali?

Ma se confrontiamo segnali/slot con occorrenza evento, quale meccanismo sarà più veloce, più efficiente e produrre meno spese generali: QTimer con la sua timeout() segnale collegato a uno slot o nuda QObject::startTimer() \ QObject::killTimer() con QObject::timerEvent()?

La risposta per la domanda di cui sopra sarà la stessa per Windows e Linux?

risposta

8

QTimer è in realtà solo un segnale slot involucro attorno alle funzionalità QObject::startTimer(), quindi avrà indubbiamente più overhead associato con esso su tutte le piattaforme (implementa internamente QObject::timerEvent() - sua implementazione di questa funzione è solo per emettere il segnale timeout()).

Nota: QBasicTimer è un involucro più leggero attorno alla funzionalità QObject::startTimer(). Se si utilizza QBasicTimer, è ancora necessario implementare QObject::timerEvent(), ma gestisce l'ID timer per voi. Come tale, un QBasicTimer combina un po 'della facilità d'uso di un QTimer con l'efficienza di utilizzare il meccanismo QObject::startTimer().

+0

Su linux QBasicTimer con 0 timeout per aggiornare un QGLWidget è ~ 0,2 msec più veloce di QTimer sulla mia macchina - grazie: D – paulm

5

In effetti, se hai bisogno di precisione, QT non garantisce che il tuo timer venga eseguito esattamente dopo 1ms.

Almeno fino a QT 4.7.X se QT ha un evento (elaborato all'interno del ciclo di eventi) tutti i timer vengono verificati per la scadenza internamente (e quindi aumentati i loro segnali) "nel loop eventi". Voglio dire, non verranno eseguiti come un evento del sistema operativo che interrompe altre attività, ecc.

Quello che si potrebbe ottenere è un timer eseguito dopo 1,5 secondi se sono necessari altri 3 eventi nel proprio ciclo, ad esempio 0,5 secondi ciascuno.

Spero che la mia memoria non stia fallendo, ho dato un'occhiata al codice dei timer QT alcuni mesi fa e ora non riesco a ricordare se gli eventi del timer vengono elaborati dopo altri eventi o prima.

Spero che questo ti aiuti un po 'di più.

+0

Dovrei porre la mia prossima domanda proprio su questo. Grazie! – Sergey

Problemi correlati