2012-08-16 5 views
7

Ist es sicher, Qt's Timer in seiner "Timeout" Signal/Slot Funktion zu stoppen? Ich kann anscheinend keine Informationen in der Qt-Dokumentation über die QTimer finden.Qt QTimer ist es sicher, es auf diese Weise zu stoppen?

Ich habe einen Timer erstellt, der regelmäßig eine "keep alive" -Nachricht an den Server sendet. Ich möchte, dass dieser Timer gestoppt wird, wenn beim Senden einer Nachricht ein Fehler auftritt.

private: 
    QTimer* mpKeepAliveTimer; 

Timer wird wie folgt initialisiert:

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

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

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD); 

wie dies Gestoppt:

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

:

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

    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

Timeout-Funktion sieht wie folgt aus.

+4

Dieser dritte Codeblock könnte verfeinern. Es besteht keine Notwendigkeit, den Timer zu stoppen, bevor er zerstört wird. Der gesamte Block kann reduziert werden, um mpKeepAliveTimer zu löschen; mpKeepAliveTimer = NULL; ' – cgmb

Antwort

7

Solange Sie Warteschlangenverbindungen nicht explizit verwenden, ist dies sicher.
Dies liegt daran, dass die Funktion emit timeout() erst zurückkehrt, wenn alle Steckplätze verarbeitet wurden, mit denen sie verbunden ist.

Wenn Sie wurden jedoch Anstehende-Verbindungen verwenden, es könnte theoretisch passieren, dass es noch nicht verarbeiteten Timeout Ereignisse in der Ereigniswarteschlange sind, so machen es hyper-safe Sie folgende verwenden:

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

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

Hinweis dass die Bedingung in Ihrer Stoppfunktion != NULL anstelle von == NULL sein sollte. Sie können auch diese Funktion wie folgt schreiben, aber:

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

Wie bereits in den Kommentaren vorgeschlagen, QTimer sich in seiner destructor zu stoppen.

+0

Uff .. danke für das Bemerken der" == NULL "Sache! (Ich habe das in meinem Beitrag bearbeitet) Ich habe die Stopp-Prozedur meines Timers geändert, wie von Slavik81 vorgeschlagen (Ich war nicht sicher, ob durch Zerstörung meines Timer-Objekts Destruktor die Timeout-Prozeduren sicher stoppen würde ...) Danke Tim Danke, Slavik81 – Gediminas

Verwandte Themen