2012-08-16 18 views
7

Qt zamanlayıcısını "zaman aşımı" sinyal/slot işlevinde durdurmak güvenli midir? QTimer ile ilgili Qt belgelerinde herhangi bir bilgi bulamıyor gibi görünüyor.Qt QTimer bu şekilde durdurmak güvenli midir?

Belirli aralıklarla "canlı tut" iletilerini sunucuya gönderen bir zamanlayıcı oluşturdum. Mesajımı gönderirken bir çeşit hata varsa, bu zamanlayıcı durdurulmasını istiyorum.

private: 
    QTimer* mpKeepAliveTimer; 

Zamanlayıcı böyle başlatılır:

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

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

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD); 

böyle durdu:

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

    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

Zaman Aşımı işlevi şöyle görünür:

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

teşekkür ederiz.

+4

Üçüncü kod bloğu rafinasyon kullanabilir. Yok edilmeden önce zamanlayıcıyı durdurmaya gerek yok. Tüm blok mpKeepAliveTimer silmek için azaltılabilir; mpKeepAliveTimer = NULL; ' – cgmb

cevap

7

Açıktan Sıralı Bağlantılar kullanmadığınız sürece, bu güvenlidir.
Bunun nedeni, bağlı olduğu tüm yuvalar işlenene kadar emit timeout() işlevinin geri dönmemesidir.

ancak Sırada Olan Bağlantıları kullanıyorlardı Eğer, teoride Olay Sırasında işlenmemiş zaman aşımı olaylar böylece hiper güvenli aşağıdaki kullanabilirsiniz yapmak, hala var bunun olabilmesi ise:

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

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

Not durma fonksiyonunuzdaki koşul == NULL yerine != NULL olmalıdır. Ayrıca aşağıdaki gibi ancak bu fonksiyon yazabiliriz: Daha önce Yorum önerilen

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

, QTimer onun yıkıcı kendisini durduracak.

+0

Uff .." == NULL "şeyini fark ettiğin için teşekkürler! (Bu yazıyı kendi başıma düzenledim) Slavik81 tarafından önerildiği gibi zamanlayıcının durma prosedürünü değiştirdim (zamanlayıcı nesnesini yok ederek yıkıcının zaman aşımı prosedürlerini güvenli bir şekilde durduracağından emin değildim ...) Teşekkürler Tim teşekkürler Slavik81 – Gediminas

İlgili konular