2012-06-27 35 views
5

मैं कुछ स्रोत कोड में खोद रहा था जिस पर मैं काम कर रहा हूं। मुझे एक असाधारण बयान मिला कि किसी ने कोड किया था। स्रोत कोड एक क्यूएमएल जीयूआई के साथ एक जीयूआई एप्लीकेशन है और क्यूटी 4.7.एक्स का उपयोग करता है।QObject आधारित कक्षा में स्वयं के लिए एक कतारबद्ध कनेक्शन है

नीचे स्निपेट कोर एप्लिकेशन तर्क से संबंधित है।

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

यह अजीब है कि पिंड एक पंक्तिबद्ध कनेक्शन के माध्यम से ही से कनेक्ट करता है जो अनिवार्य रूप से मतलब है कि वस्तु एक ही समय में अलग अलग धागे में हो सकता है "लाइव"?

पहली नज़र में यह मुझे कोई समझ नहीं आया। क्या कोई इस कारण से सोच सकता है कि ऐसा कनेक्शन व्यावहारिक या आवश्यक क्यों होगा? क्या यह भी काम करेगा?

उत्तर

9

यह बिना किसी समस्या के काम करेगा। शायद SetCurrentTaskSlot को कॉल करने से पहले कुछ इवेंट लूप प्रसंस्करण की आवश्यकता थी?

ध्यान दें कि QueuedConnection का मतलब यह नहीं है कि कुछ अलग थ्रेड में है। QueuedConnection का मतलब केवल तभी होता है जब संकेत उत्सर्जित होता है, संबंधित स्लॉट सीधे नहीं कहा जाएगा। इसे इवेंट लूप पर कतारबद्ध किया जाएगा, और जब प्रक्रिया को लूप

+0

समझ में आता है। मैं अभी भी कोड के आस-पास की चीजों को देख रहा हूं। तो यह स्पष्ट हो जाने के बाद मैं वापस आऊंगा। –

+1

तो ऐसा लगता है कि कुछ गणना करने के दौरान एक कार्य परिवर्तन सिग्नल उत्सर्जित होता है और "परिवर्तन" तुरंत नहीं होना चाहिए, लेकिन वर्तमान प्रवाह निष्पादित होने के बाद और ईवेंट प्रसंस्करण फिर से शुरू होता है। –

3

कतारबद्ध कनेक्शन का मतलब है कि रिसीवर कहां रहता है, इसके बारे में कुछ भी नहीं है। इसके विपरीत सत्य है: किसी अन्य थ्रेड में रहने वाली किसी ऑब्जेक्ट को सुरक्षित रूप से सिग्नल भेजने के लिए, आपको कतारबद्ध कनेक्शन का उपयोग करना होगा। लेकिन आप किसी भी थ्रेड में रहने वाली किसी वस्तु के लिए उनका उपयोग कर सकते हैं!

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

घटना आंतरिक QMetaCallEvent है, और यह QObject::event है जो इस घटना पर कार्य करता है और कॉल निष्पादित करता है।