2008-11-23 16 views
13

क्या कोई साधारण शब्दों में "सिग्नल और स्लॉट" पैटर्न समझा सकता है?सिग्नल और स्लॉट क्या हैं?

+1

क्या आपका मतलब क्यूटी संकेत और स्लॉट है? –

+0

सामान्य रूप से पैटर्न। विकिपीडिया इंगित करता है कि बढ़ावा भी करता है। – JeffV

उत्तर

18

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

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

चूंकि इस प्रश्न को सी ++ टैग किया गया था, यहां Boost.Signals लाइब्रेरी का एक लिंक है जिसमें बहुत अधिक विस्तृत स्पष्टीकरण है।

4

मुझे लगता है कि आप क्यूटी के सिग्नल और स्लॉट के बारे में बात कर रहे हैं।
यह बहुत आसान है।

एक वर्ग का एक उदाहरण एक सिग्नल को आग लगा सकता है और शायद एक और वर्ग का एक और उदाहरण स्लॉट में उस सिग्नल को पकड़ सकता है। यह केवल फ़ंक्शन कॉल की तरह है कि फ़ंक्शन को कॉल करने वाले व्यक्ति को यह जानने की आवश्यकता नहीं है कि कॉल कौन प्राप्त करना चाहता है।

उदाहरण देने के लिए सबसे अच्छा तरीका है उदाहरण के साथ।
कक्षा QPushButton का संकेत है QPushButton :: क्लिक किया गया()। जब भी बटन क्लिक किया जाता है तो उस सिग्नल को निकाल दिया जाता है। पुश बटन को यह जानने की आवश्यकता नहीं है कि कौन सा दिलचस्पी है कि एक क्लिक हुआ। यह सिग्नल को फायर करता है और जो भी दिलचस्पी लेता है उससे जुड़ सकता है।
QDialog जिसमें बटन रखा गया है, यह जानने में दिलचस्पी है कि बटन कब क्लिक किया गया था। इसमें स्लॉट MyDialog :: buttonClicked() है। MyDialog c'tor पर आपको कनेक्ट करने की आवश्यकता है() बटन क्लिक करें() डायलॉग के बटन पर क्लिक करेंक्लिड() स्लॉट ताकि सिग्नल निकाल दिए जाने पर स्लॉट को बुलाया जा सके।

अधिक उन्नत चीज़ें गुच्छा:

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

Here's more information in QT's documentation.

12

मुझे लगता है कि एक संकेत और स्लॉट सबसे अच्छा है जब आप Observer Pattern or Publish/Subscriber Pattern के लिए एक संभव कार्यान्वयन वाहन के रूप में उन पर देख रहे हैं का वर्णन कर सकते हैं। एक signal है, उदाहरण के लिए प्रकाशक साइड पर buttonPressed(IdType)। जब भी बटन दबाया जाता है, तो उस सिग्नल से जुड़े सभी स्लॉट को बुलाया जाता है। स्लॉट सब्सक्राइबर साइड पर हैं। एक स्लॉट उदाहरण के लिए sendMail(IdType) हो सकता है।

"बटन दबाए गए" कार्यक्रम के साथ, स्लॉट को पता चलेगा कि कौन सा बटन दबाया गया था, क्योंकि आईडी को सौंप दिया गया था। IdType प्रकाशक और सब्सक्राइबर के बीच कनेक्शन पर भेजे गए डेटा के प्रकार का प्रतिनिधित्व करता है। सब्सक्राइबर के लिए एक ऑपरेशन संभव होगा connect(signal, slot) जो buttonPressed(IdType) को sendMail(IdType) से कनेक्ट कर सकता है, ताकि यदि बटन दबाया जाता है, तो उस विशेष स्लॉट को कॉल किया जाता है।

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

अधिक जानकारी के लिए Qt Signals/Slots या Boost Signals पर देखें।

6

कल्पना करें कि आपके आवेदन में एक जीयूआई है। अधिकांश समय, नियंत्रण प्रवाह बहुत रैखिक नहीं होगा, यानी क्रियाओं का स्पष्ट अनुक्रम होने के बजाय आपके पास एक उपयोगकर्ता होगा जो जीयूआई (जैसे बटन, मेनू इत्यादि) के साथ इंटरैक्ट करता है।

यह अनिवार्य रूप से एक ईवेंट संचालित मॉडल है जिसे सिग्नल और स्लॉट पैटर्न के साथ काफी अच्छी तरह कार्यान्वित किया जा सकता है। सिग्नल वे घटनाएं होती हैं जो ऑब्जेक्ट्स (जीयूआई घटकों को सोचती हैं) द्वारा उत्पन्न होती हैं और स्लॉट उन घटनाओं के रिसीवर होते हैं।

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

अब कल्पना करें कि कुछ अन्य वस्तुएं, अर्थात् एक लेबल है, जो इस उदाहरण के लिए हमेशा एक वस्तु के रूप में मौजूद है लेकिन "प्रकट" और "गायब हो सकता है" और एक सिस्टम बीप (किसी वस्तु द्वारा भी प्रतिनिधित्व किया जा सकता है), जो कर सकता है बस बीप वे उन वस्तुओं के स्लॉट हैं। हम उन्हें "messageAppear", "messageDisappear" और "बीप" कहेंगे।

मान लीजिए कि आप हर बार चेकबॉक्स को टॉगल करने के लिए सिस्टम बीप को बीप करना चाहते हैं, और लेबल चेकबॉक्स को चेक या साफ़ करने के आधार पर दिखाई देने या गायब होने के लिए लेबल।

आप इस प्रकार निम्नलिखित संकेतों निम्नलिखित स्लॉट से कनेक्ट होता है (बाईं ओर संकेत, सही पर स्लॉट):

checkboxToggled -> beep 
checkboxSet -> messageAppear 
checkboxUnset -> messageDisappear 

मूल रूप से यह है कि।

सिग्नल और स्लॉट में भी तर्क हो सकते हैं। उदाहरण के लिए, एक स्लाइडर का उपयोग करके जो संख्यात्मक मान निर्धारित करता है, जैसे ही उपयोगकर्ता स्लाइडर को स्थानांतरित करता है, आप उत्सर्जित सिग्नल के साथ परिवर्तित मूल्य भेजना चाहते हैं: स्लाइडर चेंज (int)।

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

ध्यान रखें कि सिग्नल और स्लॉट अक्सर इस अर्थ में सममित होते हैं कि अक्सर स्लॉट से संबंधित सिग्नल हो सकता है। उदाहरण के लिए, एक चेकबॉक्स टॉगल होने पर सिग्नल उत्सर्जित कर सकता है, लेकिन इसमें एक स्लॉट भी हो सकता है जो चेकबॉक्स को टॉगल करता है। अलग-अलग चेकबॉक्स को लागू करना आसान होगा जो हमेशा एक-दूसरे के लिए विपरीत रूप से सेट होते हैं।

1

सिग्नल और स्लॉट के लिए मैंने पाया सबसे अच्छा उदाहरण और स्पष्टीकरण this code project article है।

+2

ध्यान दें कि [कड़ी-केवल उत्तर] (http://meta.stackoverflow.com/tags/link-only-answers/info) हतोत्साहित किया जाता है, अतः जवाब एक समाधान के लिए एक खोज का अंत बिंदु होना चाहिए (बनाम फिर भी संदर्भों का एक और स्टॉपओवर, जो समय के साथ पुराना हो जाता है)। लिंक को संदर्भ के रूप में रखते हुए, यहां स्टैंड-अलोन सारांश जोड़ना पर विचार करें। – kleopatra

+0

मुझे लगता है कि लिंक होना ठीक है। – VivekDev

0

एक आम गलतफहमी है कि कक्षाएं व्यक्ति, कुत्ते, साइकिल और ऐसे जैसे संज्ञाएं हैं। फिर यह समझने में समझदारी होती है कि एक व्यक्ति (उदाहरण) में एक कुत्ता और साइकिल है।

चलिए शुरूआत करते हैं (क्या होना चाहिए)। ऑब्जेक्ट्स डेटा और प्रक्रियाएं हैं। कार्यक्रम क्या हैं? डेटा और प्रक्रियाओं। ऑब्जेक्ट्स (अपेक्षाकृत) "छोटे" स्वतंत्र उप-कार्यक्रम होने चाहिए। चूंकि ओओ प्रोग्रामिंग बहुत अस्पष्ट और दुरुपयोग (उद्धरण वांछित) सिखाया जाता है, लोगों को लगता है कि सबकुछ एक वर्ग या वस्तु होना चाहिए। ऐसा नहीं है, वस्तुओं "छोटे" एपीआई (सार्वजनिक subroutines) के साथ "छोटे" स्वतंत्र कार्यक्रम हैं। कुछ प्रोग्रामर अपनी परियोजना को उप-कार्यक्रमों में भी तोड़ते नहीं हैं और केवल उन वस्तुओं का उपयोग करते हैं जहां डेटा और प्रक्रियाएं अधिक उपयुक्त होती हैं।

अब, यह मानते हुए कि हम सहमत हैं कि ऑब्जेक्ट्स प्रोग्राम हैं, हम इस बात से सहमत हो सकते हैं कि ज्यादातर मामलों में, कार्यक्रमों को समान आकार और जटिलता के अन्य कार्यक्रमों की प्रतियों की आवश्यकता नहीं होती है (यानी कोई ऑब्जेक्ट किसी अन्य को पॉइंटर नहीं करता है ऑब्जेक्ट), डेटा (जैसे डेटा-स्ट्रक्चर) के प्रबंधन के लिए इसे छोटे प्रोग्राम की आवश्यकता हो सकती है लेकिन इमो को किसी अन्य ऑब्जेक्ट की आवश्यकता नहीं है।

क्यों? क्योंकि युग्मन वस्तुओं उन्हें निर्भर करता है। वह बुरा क्यों है? क्योंकि जब वस्तुएं स्वतंत्र होती हैं तो आप उनका परीक्षण कर सकते हैं और अन्य प्रोग्रामर और ग्राहकों से भी वादा कर सकते हैं कि ऑब्जेक्ट (एक छोटा स्वतंत्र कार्यक्रम) उच्च निश्चितता के साथ कुछ कार्य करने में सक्षम है। आप यह भी सुनिश्चित कर सकते हैं कि जब तक उस ऑब्जेक्ट में कोई बदलाव नहीं किया जाता तब तक यह प्रदर्शन जारी रहता है।

तो स्लॉट और सिग्नल क्या हैं? यदि आप समझते हैं कि ऑब्जेक्ट्स प्रोग्राम की तरह हैं और उन्हें आदर्श रूप से प्रतिलिपि बनाने के लिए किसी अन्य तरीके की आवश्यकता नहीं है, तो उन्हें अन्य ऑब्जेक्ट्स में प्रतियां या पॉइंटर्स नहीं रखना चाहिए। उदाहरण के लिए, आपके कंप्यूटर पर चलने वाली प्रक्रियाएं संचार करने के लिए सॉकेट, आईपी पते और बंदरगाहों का उपयोग कर सकती हैं। ऑब्जेक्ट्स RPC के समान संकेतों और स्लॉट नामक कुछ का उपयोग कर सकते हैं। ये एक डेटा संरचना दो बड़े पदार्थों है कि वस्तु के सबरूटीन्स (slots) की दुकान के बीच एक मध्यस्थ के रूप में इरादा कर रहे हैं और इन अन्य अन्य वस्तुओं के बारे में कुछ भी जानने के बिना इन subrutines (slots) उपयुक्त मानकों के साथ जो की तुलना में वे पैरामीटर अन्य वस्तुओं कॉल करने के लिए (signal) की अनुमति आवश्यकता होती है।

तो अंतर्निहित संरचना (संभवतः) दृढ़ता से टाइप किया प्रक्रिया संकेत के सेट (संभवतः सरणियों) कर रहे हैं, कि अन्य वस्तुओं इन वस्तुओं के लिए सूचक बिना उपयुक्त मानकों के साथ कह सकते हैं। कॉलर्स को केवल सिग्नल ऑब्जेक्ट तक पहुंच की आवश्यकता होती है (जिसमें कोई कार्यान्वयन विवरण नहीं होता है) जो अपेक्षित मानकों को परिभाषित करता है।

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

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