2012-08-16 13 views
7

È sicuro interrompere il timer di Qt nella funzione "timeout" di segnale/slot? Non riesco a trovare alcuna informazione nella documentazione Qt sullo QTimer.Qt QTimer è sicuro fermarlo in questo modo?

Ho creato un timer che invia periodicamente messaggi "keep alive" al server. Voglio che questo timer sia fermato se c'è un qualche tipo di errore durante l'invio del mio messaggio.

private: 
    QTimer* mpKeepAliveTimer; 

timer è inizializzato in questo modo:

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

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

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD); 

Arrestato in questo modo:

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

    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

funzione Timeout è simile al seguente:

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

Grazie.

+4

Il terzo blocco di codice potrebbe utilizzare la rifinitura. Non è necessario fermare il timer prima che venga distrutto. L'intero blocco può essere ridotto a 'delete mpKeepAliveTimer; mpKeepAliveTimer = NULL; ' – cgmb

risposta

7

Finché non si utilizza in modo esplicito le connessioni in coda, questo è sicuro.
Questo perché la funzione emit timeout() non verrà restituita finché non saranno stati elaborati tutti gli slot a cui è collegato.

se si dovesse comunque utilizzare connessioni in coda, si potrebbe, in teoria, capita che ci sono ancora eventi di timeout non elaborati nella coda degli eventi, in modo da rendere più iper-sicuri è possibile utilizzare il seguente:

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

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

Nota che la condizione nella funzione di arresto dovrebbe essere != NULL anziché == NULL. Si può anche scrivere che funzione come segue, però:

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

come già suggerito nei commenti, QTimer si fermerà se stessa nel suo distruttore.

+0

Uff .. grazie per aver notato la cosa" == NULL "! (Ho modificato questo nel mio post) Ho modificato la procedura di arresto del mio timer come suggerito da Slavik81 (non ero sicuro se distruggendo il mio oggetto timer il suo distruttore avrebbe fermato in sicurezza le procedure di timeout ...) Grazie Tim , grazie Slavik81 – Gediminas

Problemi correlati