c++ - एमिट बनाम सिग्नल को कॉल करना जैसे कि यह क्यूटी में एक नियमित कार्य है




qt (2)

मान लें कि मेरे पास यह संकेत है:

signals:
    void progressNotification(int progress);

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

emit progressNotification(1000 * seconds);

मैं लिखूंगा:

progressNotification(1000 * seconds);

उन्हें कॉल करना ऐसा लगता है कि काम करना प्रतीत होता है, और सभी जुड़े स्लॉट निष्पादित होंगे, इसलिए उत्सर्जक कीवर्ड का उपयोग करने से अलग व्यवहार होता है, या यह सिर्फ वाक्य रचनात्मक चीनी है?


18 महीने बाद ... मैंने @ मैट के उत्तर के तहत टिप्पणियों के साथ शुरुआत की, और जल्दी से कमरे से बाहर निकल रहा था। इस प्रकार जवाब।

आईएमओ emit न तो वाक्य रचनात्मक चीनी है और न ही इस अर्थ में एक साधारण कीवर्ड है

  1. यह कोड उत्पन्न करता है (जैसा ऊपर @Mat द्वारा समझाया गया है)
  2. यह connect तंत्र को पहचानने में मदद करता है कि वास्तव में यह एक signal , और
  3. यह आपके "सिग्नल" सिस्टम का सिग्नल हिस्सा बनाता है, जहां सिग्नल और प्रतिक्रियाएं (स्लॉट) को सिंक्रनाइज़ या असीमित रूप से निष्पादित किया जा सकता है, या कतारबद्ध किया जाता है, सिग्नल कहां और कैसे उत्सर्जित होता है। यह सिग्नल / स्लॉट सिस्टम की एक बेहद उपयोगी विशेषता है।

संपूर्ण सिग्नल / स्लॉट सिस्टम एक साधारण फ़ंक्शन कॉल की तुलना में एक अलग मुहावरे है। मेरा मानना ​​है कि यह पर्यवेक्षक पैटर्न से उपजी है। signal और slot बीच भी एक बड़ा अंतर है: एक सिग्नल लागू नहीं किया जाना चाहिए, जबकि एक स्लॉट होना चाहिए !

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

कुछ बैकएंड ऑब्जेक्ट जानता है कि कितनी प्रगति हुई है। तो यह emit progressNotification(...) सकता है emit progressNotification(...) सिग्नल। यह उस वर्ग तक है जो इस सिग्नल को लेने और इसे निष्पादित करने के लिए वास्तविक प्रगति पट्टी प्रदर्शित करता है। लेकिन दृश्य इस सिग्नल से कैसे जुड़ता है? क्यूटी के सिग्नल / स्लॉट सिस्टम में आपका स्वागत है। अब आप एक प्रबंधक वर्ग (आमतौर पर एक प्रकार का विजेट) की कल्पना कर सकते हैं, जिसमें व्यू ऑब्जेक्ट और डेटा गणना ऑब्जेक्ट (दोनों QObjects ) शामिल हो सकते हैं, connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress) कर सकते हैं connect (m_myDataEngine, &DataEngine::progressNotification, m_myViewObj, &SimpleView::displayProgress)

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

यदि इसे कभी भी उत्सर्जित किए बिना सिग्नल विधि का उपयोग / कॉल करना संभव है, तो यह जरूरी है कि आपको उस कार्य को पहले स्थान पर सिग्नल के रूप में कभी भी आवश्यक न हो


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

इसके अलावा, इस पीडीएफ को देखें जो सिग्नल और स्लॉट तंत्र की प्रकृति की स्पष्ट रूप से स्पष्ट करता है: http://www.elpauer.org/stuff/a_deeper_look_at_signals_and_slots.pdf





qt