2009-11-14 9 views
18

अगर मेरे पास कक्षा ए था, जहां उसके कार्यों में से एक है:क्यूटी: घटनाओं को क्रम में संसाधित किया जाता है?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

मान लें कि कक्षा बी में 2 स्लॉट हैं, एक first_signal से जुड़ा है, और दूसरा second_signal है, क्या यह गारंटीकृत है कि स्लॉट first_signal से जुड़ा हुआ xxx22second_signal स्लॉट से पहले first_signal से हमेशा संसाधित किया जाएगा?

उत्तर

15

यदि आप सिग्नल और स्लॉट (क्यूटी :: डायरेक्टकनेक्शन) के बीच सीधा कनेक्शन प्रकार का उपयोग करते हैं तो उत्तर हाँ है।

क्यूटी सहायता प्रणाली से:

जब एक संकेत उत्सर्जित होता है, स्लॉट्स इससे जुड़े आमतौर पर तुरंत क्रियान्वित कर रहे हैं, सिर्फ एक सामान्य समारोह कॉल की तरह। जब ऐसा होता है, तो संकेत और स्लॉट तंत्र पूरी तरह से किसी भी जीयूआई घटना पाश से स्वतंत्र है। उत्सर्जन विवरण के बाद कोड का निष्पादन एक बार सभी स्लॉट वापस आ जाएगा। कतार कनेक्शन का उपयोग करते समय स्थिति थोड़ा अलग है; इस तरह के मामले में, उत्सर्जित कीवर्ड के बाद कोड तत्काल जारी रहेगा, और स्लॉट बाद में निष्पादित किया जाएगा।

आप QObject::connect विधि में enum Qt::ConnectionType में से किसी को डिफ़ॉल्ट कनेक्शन प्रकार बदल सकते हैं।

+1

मुझे लगता है कि जब तक यह डिफ़ॉल्ट नहीं है, तब तक इसकी गारंटी दी जाएगी, भले ही यह डिफ़ॉल्ट न हो। कतारबद्ध एक दो प्राथमिक घटनाओं के साथ दो घटनाओं का निर्माण करेगा, और फिर उन घटनाओं को क्रमशः संसाधित किया जाएगा। साथ ही, डिफ़ॉल्ट कनेक्शन प्रकार Qt :: AutoConnection है, जो तब तक निर्देशित करता है जब तक कि दोनों एमिटर और रिसीवर एक ही थ्रेड में न हों। –

+3

आपकी पोस्ट की आरंभिक वाक्य को पढ़ना चाहिए 'यदि आप सिग्नल और स्लॉट के बीच प्रत्यक्ष कनेक्शन प्रकार का उपयोग करते हैं'; चूंकि डिफ़ॉल्ट प्रकार 'Qt :: AutoConnection' है जो भेजने के कोड या प्राप्त करने वाली ऑब्जेक्ट अलग-अलग धागे में रहते हैं या नहीं, इस पर निर्भर करता है। ['क्यूटी :: कनेक्शन टाइप प्रकार 'दस्तावेज़ देखें (http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum) और [थ्रेड, ईवेंट और QObjects] (http: // qt- project.org/wiki/Threads_Events_QObjects)। – Hossein

+2

यदि आपने Qt :: QueuedConnection (या Qt :: AutoConnection और स्लॉट सिग्नल के लिए एक अलग थ्रेड में था) चुना है, तो निश्चित रूप से स्लॉट को असीमित रूप से कहा जाएगा, लेकिन मुझे लगता है कि सवाल अभी भी खड़ा है "क्या यह गारंटी है कि स्लॉट जो first_signal से जुड़ा हुआ है हमेशा दूसरे_सिग्नल स्लॉट से पहले संसाधित किया जाएगा? " किसी को जवाब मिला है? –

संबंधित मुद्दे

 संबंधित मुद्दे