2012-09-27 7 views
7

Necesito que se active un temporizador cada 1 ms. This informes de documentos, esa invocación de ranura puede ser mucho más lenta que incluso una llamada de función virtual.Qtimer vs timerEvent - ¿cuál de ellos produce menos sobrecarga?

Pero si comparamos señales/slots con ocurrencia de eventos, qué mecanismo será más rápido, más eficiente y producir menos gastos generales: QTimer con él es timeout() señal conectada a una ranura o desnudo QObject::startTimer() \ QObject::killTimer() con QObject::timerEvent()?

¿La respuesta a la pregunta anterior será la misma para Windows y Linux?

Respuesta

8

QTimer es en realidad sólo un envoltorio-ranura señal en torno a la funcionalidad QObject::startTimer(), por lo que sin duda tendrá un mayor gasto asociado a él en todas las plataformas (internamente implementa QObject::timerEvent() - el cumplimiento de esta función es sólo para emitir la señal de timeout())

De nota, QBasicTimer es una envoltura más ligera alrededor de la funcionalidad QObject::startTimer(). Si usa QBasicTimer, aún tiene que implementar QObject::timerEvent(), pero administra la identificación del temporizador por usted. Como tal, un QBasicTimer combina algo de la facilidad de uso de un QTimer con la eficiencia del uso del mecanismo QObject::startTimer().

+0

En linux QBasicTimer con 0 tiempo de espera para actualizar un QGLWidget es ~ 0.2msecs más rápido que QTimer en mi máquina - gracias: D – paulm

5

De hecho, si necesita precisión, QT no garantiza que su temporizador se ejecute exactamente después de 1ms.

Al menos hasta QT 4.7.X si QT tiene un evento (procesado dentro del bucle de evento), todos los temporizadores se verifican por espiración internamente (y luego levantan sus señales) "en el bucle de evento". Quiero decir, no se ejecutarán como un evento del SO que interrumpe otras tareas, etc.

Lo que podría obtenerse es un temporizador ejecutado después de 1.5 segundos si cualquier otro 3 eventos en su ciclo necesita, por ejemplo, 0.5 segundos cada uno.

Espero que mi memoria no falle, eché un vistazo al código de temporizadores QT hace algunos meses y ahora no recuerdo si los eventos del temporizador se procesaron después de otros eventos o antes.

Espero que esto te ayude un poco más.

+0

Se supone que debo hacer mi siguiente pregunta al respecto. ¡Gracias! – Sergey

Cuestiones relacionadas