2012-08-16 6 views
7

क्या यह क्यूटी के टाइमर को "टाइमआउट" सिग्नल/स्लॉट फ़ंक्शन में रोकना सुरक्षित है? QTimer के बारे में क्यूटी दस्तावेज में कोई जानकारी नहीं मिल रही है।क्यूटी क्यूटीमर इसे इस तरह से रोकने के लिए सुरक्षित है?

मैंने एक टाइमर बनाया है जो समय-समय पर सर्वर पर "जीवित रखें" संदेश भेज रहा है। यदि मैं अपना संदेश भेजते समय कुछ प्रकार की त्रुटि करता हूं तो मैं इस टाइमर को रोकना चाहता हूं।

private: 
    QTimer* mpKeepAliveTimer; 

टाइमर इस तरह आरंभ नहीं हो जाता:

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

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

mpKeepAliveTimer->start(KEEP_ALIVE_PERIOD); 

इस तरह रूका:

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

    delete mpKeepAliveTimer; 
    mpKeepAliveTimer = NULL; 
} 

समय समाप्त समारोह इस तरह दिखता है:

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

धन्यवाद।

+4

वह तीसरा कोड ब्लॉक रिफाइनिंग का उपयोग कर सकता है। नष्ट होने से पहले टाइमर को रोकने की जरूरत नहीं है। पूरे ब्लॉक को हटाया जा सकता है 'mpKeepAliveTimer हटाएं; mpKeepAliveTimer = NULL; ' – cgmb

उत्तर

7

जब तक आप स्पष्ट रूप से कतारबद्ध कनेक्शन का उपयोग नहीं कर रहे हैं, यह सुरक्षित है।
ऐसा इसलिए है क्योंकि emit timeout() फ़ंक्शन तब तक वापस नहीं आएगा जब तक कि उन सभी स्लॉट्स को संसाधित नहीं किया जाता था।

आप फिर भी कतार में कनेक्शन उपयोग कर रहे थे, यह सिद्धांत रूप में भी हो सकता है अगर अभी हैं कि घटना कतार में असंसाधित टाइमआउट घटनाओं, तो यह अति सुरक्षित आप इस्तेमाल कर सकते हैं निम्नलिखित बनाने के लिए:

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

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

नोट कि आपके स्टॉप फ़ंक्शन की स्थिति के बजाय != NULL होनी चाहिए। इस प्रकार तुम भी है कि समारोह में लिख सकते हैं, तथापि:

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

जैसा कि पहले ही टिप्पणी में सुझाव दिया, QTimer इसके नाशक में ही बंद हो जाएगा।

+0

उफ .." == नल "चीज़ को ध्यान में रखते हुए धन्यवाद! (मैंने इसे अपनी पोस्ट में संपादित किया है) मैंने स्लाविक 81 द्वारा सुझाए गए अनुसार टाइमर की रोकथाम प्रक्रिया को संशोधित किया है (मुझे यकीन नहीं था कि मेरे टाइमर ऑब्जेक्ट को नष्ट कर दिया गया है, यह विनाशक समय-समय पर प्रक्रियाओं को सुरक्षित रूप से रोक देगा ...) धन्यवाद टिम धन्यवाद Slavik81 – Gediminas