2012-08-16 37 views
7

¿Es seguro detener el cronómetro de Qt en su función de ranura/señal de "tiempo de espera"? Parece que no se puede encontrar información en la documentación de Qt sobre QTimer.Qt QTimer ¿es seguro detenerlo de esta manera?

He creado un temporizador que periódicamente envía un mensaje de "mantener vivo" al servidor. Quiero detener este temporizador si hay algún tipo de error al enviar mi mensaje.

private: 
    QTimer* mpKeepAliveTimer; 

temporizador se inicializa como esto:

mpKeepAliveTimer = new QTimer(/* this */); 

QObject::connect(mpKeepAliveTimer, SIGNAL(timeout()), this, SLOT(OnKeepAlive())); 

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD); 

Detenido así:

if (mpKeepAliveTimer != NULL) // <-- Edited 
{ 
    if (mpKeepAliveTimer->isActive() == true) 
     mpKeepAliveTimer->stop(); 

    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

función de tiempo de espera es el siguiente:

void Classname::OnKeepAlive() 
{ 
    if (isErrorFound == true) 
     mpKeepAliveTimer->stop(); // <---- IS THIS SAFE? 
} 

Gracias.

+4

Ese tercer bloque de código podría usar refinación. No es necesario detener el temporizador antes de que se destruya. El bloque completo se puede reducir a 'eliminar mpKeepAliveTimer; mpKeepAliveTimer = NULL; ' – cgmb

Respuesta

7

Siempre que no esté utilizando explícitamente las conexiones en cola, esto es seguro.
Esto se debe a que la función emit timeout() no volverá hasta que se hayan procesado todas las ranuras a las que está conectado.

Si embargo estaban utilizando conexiones en cola, en teoría podría ocurrir que todavía hay eventos de tiempo de espera no procesados ​​en la cola de eventos, por lo que para que sea hiper-seguro que podría utilizar lo siguiente:

void Classname::OnKeepAlive() 
{ 
    if (!mpKeepAliveTimer || !mpKeepAliveTimer->isActive()) return; 

    if (isErrorFound) 
    { 
     mpKeepAliveTimer->stop(); 
    } 
} 

Nota que la condición en su función de parada debe ser != NULL en lugar de == NULL. También puede escribir que la función de la siguiente manera, sin embargo:

if (mpKeepAliveTimer) 
{ 
    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

Como ya se ha sugerido en los comentarios, QTimer dejará de sí misma en su destructor.

+0

Uff ... gracias por notar la cosa" == NULL "! (He editado esto en mi publicación) Modifiqué el procedimiento de detención de mi temporizador según lo sugerido por Slavik81 (No estaba seguro de si al destruir mi objeto de temporizador su destructor podría detener con seguridad los procedimientos de tiempo de espera ...) Gracias Tim , gracias Slavik81 – Gediminas

Cuestiones relacionadas