एक घटना श्रोता कैसे काम करता है?


125

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

मेरा सवाल यह है कि प्रोग्रामिंग लैंग्वेज या स्थिति पर ध्यान दिए बिना, यह एक इवेंट श्रोता कैसे काम करता है?

मेरा अंतर्ज्ञान यह मान लेगा कि इवेंट श्रोता लगातार जाँचता है कि क्या घटना को निकाल दिया गया है, मतलब, मेरे परिदृश्य में, यह हर फ्रेम की जाँच से अलग नहीं होगा यदि इवेंट को निकाल दिया गया है।

कक्षा में चर्चा के आधार पर, ऐसा लगता है कि इवेंट श्रोता एक अलग तरीके से काम करता है।

एक घटना श्रोता कैसे काम करता है?


34
एक ईवेंट श्रोता बिल्कुल जाँच नहीं करता है। यह कहा जाता है जब घटना है कि यह आग के लिए "सुन" है।
रॉबर्ट हार्वे

13
हाँ, लेकिन यह कैसे "सुनता है", क्या यह लगातार जाँच नहीं करेगा?
गैरी हॉलिडे

28
नहीं। "ईवेंट श्रोता" शायद शब्दों का एक खराब विकल्प है; यह वास्तव में बिल्कुल भी नहीं सुनता है। सभी ईवेंट श्रोता इस बात की प्रतीक्षा करते हैं कि जब यह आग लगने वाली घटना को किसी अन्य विधि की तरह बुलाए। जब तक इसे इस तरह से नहीं कहा जाता है, तब तक यह कुछ भी नहीं करता है।
रॉबर्ट हार्वे

28
हर बार जब आप यह देखने के लिए जांचते हैं कि बटन धक्का दिया गया है, तो यह आपको घड़ी चक्र की लागत देता है। ईवेंट हैंडलर (श्रोता) केवल तभी आपको लागत देता है जब बटन वास्तव में धकेल दिया जाता है।
रॉबर्ट हार्वे

45
@ रॉबर्टहर्वे - जरूरी नहीं, "श्रोताओं" के रूप में अभी भी निचले स्तर पर निरंतर मतदान की आवश्यकता है। आप बस कोड की अपनी परत से जटिलता को धक्का देते हैं जो हार्डवेयर में बाधा या जो भी हो। और हां, यह आमतौर पर अधिक कुशल होगा, लेकिन इसलिए नहीं कि सुनना मतदान से बेहतर है, ऐसा इसलिए है क्योंकि निचले स्तर पर मतदान C # से मतदान और आपके और हार्डवेयर के बीच अमूर्त की 15 परतों की तुलना में अधिक कुशल है।
15

जवाबों:


140

आपके द्वारा प्रदत्त मतदान के उदाहरण के विपरीत (जहाँ बटन हर फ्रेम की जाँच की जाती है), एक इवेंट श्रोता यह नहीं जाँचता है कि बटन को धक्का दिया गया है या नहीं। इसके बजाय, यह कहा जाता है जब बटन को धक्का दिया जाता है।

शायद "इवेंट श्रोता" शब्द आपको फेंक रहा है। यह शब्द बताता है कि "श्रोता" सक्रिय रूप से सुनने के लिए कुछ कर रहा है, जब वास्तव में, यह कुछ भी नहीं कर रहा है। "श्रोता" केवल एक फ़ंक्शन या विधि है जिसे घटना के लिए सदस्यता ली जाती है। जब घटना आग जाती है, तो श्रोता विधि ("ईवेंट हैंडलर") कहलाती है।

इवेंट पैटर्न का लाभ यह है कि बटन को वास्तव में धकेलने तक कोई लागत नहीं है। घटना को बिना निगरानी के इस तरह से नियंत्रित किया जा सकता है क्योंकि यह उस चीज से उत्पन्न होता है जिसे हम "हार्डवेयर रुकावट" कहते हैं, जो संक्षेप में घटना को चलाने के लिए चल रहे कोड को पूर्व निर्धारित करता है।

कुछ यूआई और गेम फ्रेमवर्क कुछ "संदेश लूप" का उपयोग करते हैं, जो बाद में (आमतौर पर कम) समय अवधि में निष्पादन के लिए घटनाओं की कतार लगाते हैं, लेकिन आपको उस घटना को पहली बार संदेश लूप में प्राप्त करने के लिए एक हार्डवेयर अवरोध की आवश्यकता होती है।


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

46
@whatsisname जबकि हूड के तहत मामला बहुत गहरा है , अभ्यास में गेम इंजन संभवतः अवरोधों के साथ काम नहीं कर रहे हैं, लेकिन वास्तव में अभी भी एक लूप में एक इवेंट स्रोत को मतदान कर रहे हैं। यह सिर्फ इतना है कि यह मतदान केंद्रीकृत और अनुकूलित है, ताकि अधिक ईवेंट श्रोताओं को जोड़ने से अतिरिक्त मतदान और जटिलता न हो।
gntskn

7
@PieterGeerkens मुझे लगता है कि gntskn का मतलब था कि गेम इंजन लूप के हिस्से के रूप में, एक कदम है जो किसी भी उत्कृष्ट घटनाओं के लिए जाँच करता है। घटनाओं को प्रत्येक लूप के दौरान सभी अन्य एक बार-प्रति-लूप गतिविधियों के साथ संसाधित किया जाएगा। घटनाओं पर जाँच के लिए एक अलग लूप नहीं होगा ।
जोशुआ टेलर

2
@Voo: इस पोस्ट में विस्तार से इस स्तर पर नहीं आने के लिए सभी और अधिक कारण।
रॉबर्ट हार्वे

2
@Voo: मैं कीबोर्ड और माउस बटन पर भौतिक कुंजी की तरह बटन के बारे में बात कर रहा हूँ।
whatsisname

52

ई-मेल न्यूज़लेटर सदस्यता के लिए एक ईवेंट श्रोता (आप अपडेट प्राप्त करने के लिए खुद को पंजीकृत करते हैं, जिसका प्रसारण बाद में प्रेषक द्वारा शुरू किया जाता है), बजाय एक वेब पेज को ताज़ा करने के (जहां आप सूचना के हस्तांतरण की शुरुआत करते हैं)।

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


38

संक्षिप्त, असंतोषजनक उत्तर यह है कि आवेदन एक संकेत (घटना) प्राप्त करता है और यह कि दिनचर्या केवल उस बिंदु पर कहा जाता है।

लंबी व्याख्या थोड़ा और अधिक शामिल है।

ग्राहक घटनाएँ कहाँ से आती हैं?

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

आवेदन कार्यक्रम कहां से आते हैं?

ऑपरेटिंग सिस्टम घटनाओं को भेजते हैं जैसे वे होते हैं। वे अपने स्वयं के चालकों द्वारा अधिसूचित किए जाने पर प्रतिक्रियात्मक रूप से ऐसा करते हैं।

ड्राइवर घटनाओं को कैसे उत्पन्न करते हैं?

मैं एक विशेषज्ञ नहीं हूं, लेकिन यह सुनिश्चित करने के लिए कि कुछ CPU उपयोग बाधित करते हैं: जिस हार्डवेयर को वे नियंत्रित करते हैं वह सीपीयू पर एक पिन उठाता है जब नया डेटा उपलब्ध होता है; सीपीयू चालक को आग लगा देता है जो आने वाले डेटा को संभालता है जो अंततः एक (क्यू) घटनाओं को उत्पन्न करता है और फिर ओएस पर नियंत्रण वापस करता है।

तो जैसा कि आप देख रहे हैं, आपका आवेदन वास्तव में हर समय नहीं चल रहा है। यह उन प्रक्रियाओं का एक गुच्छा है जो घटनाओं के रूप में ओएस (सॉर्टा) द्वारा निकाल दिया जाता है, लेकिन बाकी समय कुछ भी नहीं करता है।


उल्लेखनीय अपवाद हैं जैसे एक बार के लिए खेल जो चीजों को अलग तरीके से कर सकते हैं


10
यह उत्तर बताता है कि किसी ब्राउज़र में माउस क्लिक घटनाओं के लिए कोई मतदान क्यों शामिल नहीं है। हार्डवेयर व्यवधान उत्पन्न करता है => ड्राइवर इसे OS इवेंट में हल करता है => ब्राउज़र इसे DOM इवेंट में हल करता है => JS इंजन उस इवेंट के लिए श्रोता चलाता है।
टिब्बो

@ टिबोस इसे कीबोर्ड की घटनाओं, टाइमर इवेंट्स, पेंट इवेंट्स इत्यादि पर भी लागू करता है
स्किलिवज़

19

शब्दावली

  • घटना : एक प्रकार की बात जो हो सकती है।

  • ईवेंट फायरिंग : ईवेंट की एक विशिष्ट घटना; एक घटना हो रही है।

  • ईवेंट श्रोता : कुछ ऐसा जो ईवेंट फ़ेरिंग्स के लिए दिखता है।

  • ईवेंट हैंडलर : कुछ ऐसा होता है जब एक ईवेंट श्रोता एक इवेंट फायरिंग का पता लगाता है।

  • ईवेंट सब्सक्राइबर : एक प्रतिक्रिया जो इवेंट हैंडलर को कॉल करने वाली है।

ये परिभाषाएँ कार्यान्वयन पर निर्भर नहीं करती हैं, इसलिए उन्हें अलग-अलग तरीकों से लागू किया जा सकता है।

इनमें से कुछ शब्द आमतौर पर समानार्थक शब्द के लिए गलत हैं क्योंकि अक्सर उपयोगकर्ताओं को उनके बीच अंतर करने की आवश्यकता नहीं होती है।

सामान्य परिदृश्य

  1. प्रोग्रामिंग-लॉजिक इवेंट।

    • घटना जब कुछ विधि कहा जाता हो जाता है।

    • एक घटना फायरिंग कि विधि के लिए किसी विशेष कॉल है।

    • घटना श्रोता घटना विधि है कि प्रत्येक घटना फायरिंग कि ईवेंट हैंडलर कॉल पर कहा जाता है में एक हुक है।

    • ईवेंट हैंडलर घटना ग्राहकों की एक संग्रह कहता है।

    • घटना ग्राहक (रों) प्रदर्शन भी कदम (रों) प्रणाली घटना की घटना के जवाब में होने का मतलब है।

  2. बाहरी घटनाएँ।

    • घटना एक बाहरी हो रहा है कि observables से अनुमान लगाया जा सकता है।

    • एक ईवेंट फायरिंग तब होती है जब उस बाहरी घटना को होने के रूप में पहचाना जा सकता है।

    • घटना श्रोता किसी भी तरह घटना फायरिंग का पता लगाता है, अक्सर मतदान से नमूदार (रों), तो यह एक घटना फायरिंग का पता लगाने पर ईवेंट हैंडलर कहता है।

    • ईवेंट हैंडलर घटना ग्राहकों की एक संग्रह कहता है।

    • घटना ग्राहक (रों) प्रदर्शन भी कदम (रों) प्रणाली घटना की घटना के जवाब में होने का मतलब है।

मतदान बनाम घटना के फायरिंग तंत्र में हुक डालना

दूसरों द्वारा बनाया गया बिंदु यह है कि मतदान अक्सर आवश्यक नहीं होता है। ऐसा इसलिए है क्योंकि ईवेंट श्रोताओं को स्वचालित रूप से ईवेंट हैंडलर कहकर लागू किया जा सकता है, जो अक्सर घटनाओं को सिस्टम-स्तर पर होने वाली घटनाओं को लागू करने का सबसे कुशल तरीका है।

सादृश्य से, आपको मेल के लिए हर दिन अपने मेल बॉक्स की जांच करने की आवश्यकता नहीं है यदि डाक कर्मचारी आपके दरवाजे पर दस्तक देता है और मेल को सीधे आपको सौंपता है।

हालाँकि, इवेंट श्रोता भी मतदान करके काम कर सकते हैं। मतदान के लिए एक विशिष्ट मूल्य या अन्य अवलोकन योग्य होने की आवश्यकता नहीं है; यह अधिक जटिल हो सकता है। लेकिन, कुल मिलाकर, मतदान की बात यह है कि जब कोई घटना घटित होती है तो इसका उत्तर दिया जा सकता है।

सादृश्य से, आपको हर दिन अपने मेल बॉक्स की जांच करनी होगी जब डाक कर्मचारी बस इसमें मेल ड्रॉप करता है। यदि आप डाक कर्मचारी को अपने दरवाजे पर दस्तक देने का निर्देश दे सकते हैं, तो आपको यह मतदान कार्य नहीं करना होगा, लेकिन यह अक्सर एक संभावना नहीं है।

चैनिंग इवेंट लॉजिक

कई प्रोग्रामिंग भाषाओं में, आप एक ऐसी घटना लिख ​​सकते हैं जिसे बस तब बुलाया जाता है जब कीबोर्ड पर एक कुंजी दबाया जाता है या एक निश्चित समय पर। हालाँकि ये बाहरी घटनाएँ हैं, आपको इनके लिए चुनाव करने की आवश्यकता नहीं है। क्यों?

ऐसा इसलिए है क्योंकि ऑपरेटिंग सिस्टम आपके लिए मतदान कर रहा है। उदाहरण के लिए, कीबोर्ड की स्थिति जैसे सामानों के लिए विंडोज चेक करता है, और यदि यह एक का पता लगाता है, तो यह ईवेंट सब्सक्राइबर्स को बुलाएगा। इसलिए, जब आप एक कीबोर्ड प्रेस ईवेंट की सदस्यता लेते हैं, तो आप वास्तव में एक ईवेंट की सदस्यता ले रहे होते हैं जो स्वयं एक ईवेंट का सब्सक्राइबर होता है जो पोल करता है।

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


मेरा अंतर्ज्ञान यह मान लेगा कि इवेंट श्रोता लगातार जाँचता है कि क्या घटना को निकाल दिया गया है, मतलब, मेरे परिदृश्य में, यह हर फ्रेम की जाँच से अलग नहीं होगा यदि इवेंट को निकाल दिया गया है।

कक्षा में चर्चा के आधार पर, ऐसा लगता है कि इवेंट श्रोता एक अलग तरीके से काम करता है।

एक घटना श्रोता कैसे काम करता है?

जैसा कि आपको संदेह है, एक घटना मतदान के माध्यम से काम कर सकती है । और अगर किसी घटना का संबंध किसी बाहरी घटना से है, उदाहरण के लिए कीबोर्ड की एक कुंजी दबाई जा रही है, तो मतदान किसी बिंदु पर होना है।

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

अद्यतन: निम्न-स्तरीय हार्डवेयर मतदान पर

यह पता चला है कि USB उपकरणों और अन्य आधुनिक संचार प्रोटोकॉल में परस्पर क्रिया के लिए आकर्षक नेटवर्किंग जैसा प्रोटोकॉल होता है, जिससे मैं / ओ उपकरणों सहित कीबोर्ड और चूहों को तदर्थ टोपोलॉजी में संलग्न करने में सक्षम बनाता हूं ।

दिलचस्प है, " व्यवधान " काफी जरूरी, तुल्यकालिक चीजें हैं, इसलिए वे तदर्थ नेटवर्किंग टोपोलॉजी को संभाल नहीं पाते हैं । इसे ठीक करने के लिए, " इंटरप्ट " को अतुल्यकालिक उच्च-प्राथमिकता वाले पैकेट में " इंटरएक्शन लेनदेन " (यूएसबी के संदर्भ में) या " संदेश-संकेतित इंटरप्ट " (पीसीआई के संदर्भ में) में सामान्यीकृत किया गया है । यह प्रोटोकॉल USB विनिर्देशन में वर्णित है:

यहां छवि विवरण दर्ज करें

- " चित्र 8-31। " यूनिवर्सल सीरियल बस विशिष्टता, संशोधन 2.0 " , मुद्रित-पृष्ठ -222 में बल्क / कंट्रोल / इंटरप्ट ऑउट ट्रांजैक्शन होस्ट स्टेट मशीन " ; पीडीएफ-पृष्ठ -2500 (2000-04-27)

यह प्रतीत होता है कि I / O उपकरण और संचार घटक (जैसे USB हब) मूल रूप से नेटवर्क उपकरणों की तरह काम करते हैं। इसलिए, वे संदेश भेजते हैं, जिसके लिए उनके बंदरगाहों और जैसे मतदान की आवश्यकता होती है। यह समर्पित हार्डवेयर लाइनों की आवश्यकता को कम करता है।

विंडोज जैसे ऑपरेटिंग सिस्टम मतदान प्रक्रिया ही संभाल करने लगते हैं, जैसे में वर्णित के रूप के लिए MSDN प्रलेखीकरण USB_ENDPOINT_DESCRIPTORकी जो कैसे नियंत्रित करने के लिए बताता है कि कैसे अक्सर विंडोज चुनाव बाधा / समकालिक संदेशों के लिए एक USB होस्ट नियंत्रक:

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

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

- "USB_ENDPOINT_DESCRIPTOR संरचना" , हार्डवेयर देव केंद्र, Microsoft

नए मॉनिटर कनेक्शन प्रोटोकॉल जैसे DisplayPort समान प्रतीत होते हैं:

मल्टी-स्ट्रीम ट्रांसपोर्ट (MST)

  • MST (मल्टी-स्ट्रीम ट्रांसपोर्ट) DisplayPort Ver.1.2 में जोड़ा गया

    • Ver.1.1a में केवल SST (सिंगल-स्ट्रीम ट्रांसपोर्ट) उपलब्ध था
  • एमएसटी एक कनेक्टर पर कई ए / वी धाराओं को स्थानांतरित करता है

    • 63 धाराओं तक; "स्ट्रीम प्रति लेन" नहीं

      • उन परिवहन धाराओं के बीच कोई समकालिकता ग्रहण नहीं की गई; एक धारा खाली होने की अवधि में हो सकती है जबकि अन्य नहीं
    • एक कनेक्शन-उन्मुख परिवहन

      • स्ट्रीम ट्रांसमिशन शुरू करने से पहले AUX CH priors पर संदेश लेनदेन के माध्यम से स्थापित एक स्ट्रीम स्रोत से एक लक्ष्य स्ट्रीम सिंक तक पथ

      • शेष धाराओं को प्रभावित किए बिना एक धारा का जोड़ / विलोपन

यहां छवि विवरण दर्ज करें

-Slide # 14 "DisplayPortTM Ver.1.2 ओवरव्यू" (2010-12-06) से

यह अमूर्त कुछ साफ सुविधाओं के लिए अनुमति देता है, जैसे एक कनेक्शन से 3 मॉनिटर चलाना:

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

- "डिस्प्लेपोर्ट" , विकिपीडिया

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

अंततः, की-प्रेस जैसी घटनाओं को सॉफ्टवेयर-स्तर की अनिवार्य घटना-फायरिंग तंत्र से मिलने से पहले घटनाओं की एक दिलचस्प श्रृंखला के माध्यम से जाना लगता है।


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

हालाँकि, मेल डिलीवरी के साथ आपकी उपमाएँ ठीक उसी प्रकार हैं जैसे मैं उच्च स्तरीय गतिविधि की व्याख्या करता हूँ।
बारमर

1
@Barar Ya को पता है, जब डिवाइस USB कनेक्शन में चले गए, तो इस बारे में बहुत सी बातें हुईं कि वे सीधे जनरेट करने में कैसे रुकावट डालते हैं (जैसे PS / 2 कीबोर्ड करता है) मतदान की आवश्यकता होती है (जैसे USB कीबोर्ड करता है), और कुछ स्रोत दावा करते हैं सीपीयू द्वारा किया गया मतदान। लेकिन, अन्य स्रोतों का दावा है कि यह एक विशेष नियंत्रक पर किया गया है जो मतदान को सीपीयू के लिए एक रुकावट में परिवर्तित करता है।
Nat

@ बरमार क्या आपको पता होगा कि कौन सा सही है? मैंने शायद अधिक स्रोतों से दावा किया है कि सीपीयू मतदान को अन्यथा की तुलना में करता है, लेकिन इसके लिए एक विशेष नियंत्रक अधिक समझ में आता है। मेरा मतलब है, मुझे लगता है कि Arduino और अन्य एम्बेडेड उपकरणों में सीपीयू को मतदान करने की आवश्यकता होती है, लेकिन मुझे x86- प्रकार के उपकरणों के बारे में पता नहीं है।
Nat

1
अगर कोई भी पुष्टि कर सकता है तो मैं इस उत्तर को अपडेट कर सकता हूं, मुझे लगता है कि आधुनिक I / O डिवाइस, उदाहरण के लिए USB से जुड़े लोग, सीधे मेमोरी में लिखते हैं , CPU के नियंत्रण को दरकिनार करते हैं (जो दोनों को तेज / कुशल और एक सुरक्षा क्यों कहते हैं) समय पर खतरा )। फिर, नए संदेशों की जांच के लिए मेमोरी को प्रदूषित करने के लिए एक आधुनिक ओएस की आवश्यकता होती है।
नेट

8

धक्का बनाम धक्का

यह जांचने के लिए दो मुख्य रणनीतियाँ हैं कि क्या कोई घटना हुई, या एक विशिष्ट स्थिति तक पहुँच गया है। उदाहरण के लिए, एक महत्वपूर्ण वितरण की प्रतीक्षा करने की कल्पना करें:

  • खींचो : हर 10 मिनट में, अपने मेलबॉक्स पर जाएं और जांचें कि क्या उसे डिलीवर किया गया है,
  • पुश : डिलीवरी करने वाले को कहें कि जब वे डिलीवरी करें तो आपको कॉल करें।

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

दूसरी ओर, पुश दृष्टिकोण आम तौर पर अधिक कुशल होता है: आपका कोड केवल तभी चलता है जब उसे कुछ करना होता है। दूसरी ओर, यह आवश्यक है कि आपके पास श्रोता / पर्यवेक्षक / कॉलबैक 1 को पंजीकृत करने के लिए एक तंत्र मौजूद हो ।

1 मेरा मेलमैन आमतौर पर इस तरह के तंत्र का अभाव है, दुर्भाग्य से।


1

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

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

इन सब के अलावा, सुनहरा नियम याद रखें - समय से पहले अनुकूलन सभी बुराई की जड़ है , जो विशेष रूप से वीडियो गेम में सच है, जहां अक्सर प्रत्येक फ्रेम को प्रस्तुत करने की प्रक्रिया इतनी अधिक होती है, कि इस तरह की छोटी स्क्रिप्ट अनुकूलन पूरी तरह से महत्वहीन हैं


मैं एक केंद्रीय ईवेंट लूप को ऑप्टिमाइज़ेशन के रूप में नहीं देख पाऊंगा, लेकिन कोड बेस में फैले मतदान के विपरीत अधिक पठनीय, सुगम कोड लिखने के रूप में। यह "सिंथेटिक" घटनाओं और घटनाओं को खेल इंजन के मतदान से नहीं आने देता है।
ब्लैकजैक

@BlackJack मैं सहमत हूं और मैं आमतौर पर इसे खुद इस तरह से कोड करता हूं, लेकिन ओपी ने प्रदर्शन के बारे में पूछा। Btw, एकता ने आश्चर्यजनक रूप से इस तरह के कई संदिग्ध कोड डिजाइन निर्णय लिए हैं, जैसे लगभग हर जगह स्थैतिक कार्य।
दुनो

1

जब तक आपके ओएस / फ्रेमवर्क में कुछ समर्थन नहीं होता है जो बटन पुश या टाइमर अतिप्रवाह या संदेश के आगमन जैसी घटनाओं को संभालता है - आपको इस इवेंट श्रोता पेटेंट को वैसे भी मतदान का उपयोग करके लागू करना होगा (कहीं नीचे)।

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

  1. कोड क्लीनर और अधिक पृथक दिखता है (यदि इसे सही ढंग से लागू किया गया है, तो निश्चित रूप से)
  2. ईवेंट हैंडलर्स पर आधारित कोड में बेहतर बदलाव होते हैं (क्योंकि आप आमतौर पर ईवेंट हैंडलर्स में से कुछ को ही संशोधित करते हैं)
  3. यदि आप घटना समर्थन के साथ प्लेटफ़ॉर्म पर जाने के लिए होते हैं - तो आप अपने मौजूदा ईवेंट हैंडलर का पुन: उपयोग कर सकते हैं और केवल मतदान कोड से छुटकारा पा सकते हैं।

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


1

अधिकांश ईवेंट लूप ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए कुछ पोलिंग मल्टीप्लेक्सिंग प्राइमेट के ऊपर बनाए गए हैं। लिनक्स पर, वह आदिम अक्सर poll(2) सिस्टम कॉल होता है (लेकिन पुराना हो सकता है select)। GUI अनुप्रयोगों में, प्रदर्शन सर्वर (जैसे Xorg , या Wayland ) आपके आवेदन के साथ संचार कर रहा है (एक सॉकेट (7) या पाइप (7) )। एक्स विंडो सिस्टम प्रोटोकॉल और आर्किटेक्चर के बारे में भी पढ़ें ।

इस तरह के मतदान आदिम कुशल हैं; जब कुछ इनपुट किया जाता है (और कुछ रुकावट को नियंत्रित किया जाता है) तो कर्नेल आपकी प्रक्रिया को जाग्रत करेगा।

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

(मैं सरल कर रहा हूं, वास्तव में चीजें बहुत अधिक जटिल हैं)


1

विशुद्ध रूप से मतदान आधारित प्रणाली में, सबसिस्टम जो यह जानना चाहता है कि जब कुछ विशेष क्रिया होती है तो किसी भी समय कुछ कोड चलाने की आवश्यकता होगी जो कि कार्रवाई होगी। यदि कई उपप्रणालियाँ हैं जो प्रत्येक को कुछ आवश्यक-विशिष्ट घटना के 10ms के भीतर प्रतिक्रिया करने की आवश्यकता होगी, तो वे सभी को कम से कम 100 बार / सेकंड की जाँच करने की आवश्यकता होगी कि क्या उनकी घटना हुई थी। यदि वे सबसिस्टम अलग-अलग थ्रेड्स (या बदतर, प्रोसेस) प्रक्रियाओं में हैं, तो ऐसे हर थ्रेड या 100x / सेकंड में स्विच करने की आवश्यकता होगी।

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

यदि कई उपप्रणालियाँ ऐसी हैं जो कुछ परिवर्तन होने पर अधिसूचना चाहती हैं, तो एक समर्पित निगरानी उपतंत्र होने पर अन्य उपप्रणालियों को सूचित करें जब घटनाएं होती हैं कि वे रुचि रखते हैं तो प्रत्येक उपतंत्र के अपनी घटनाओं के सर्वेक्षण की तुलना में अधिक कुशल हो सकता है। उन मामलों में एक समर्पित निगरानी उपतंत्र स्थापित करना, जहां कोई भी किसी भी कार्यक्रम में दिलचस्पी नहीं रखता है, हालांकि, संसाधनों की शुद्ध बर्बादी का प्रतिनिधित्व करेगा। अगर कुछ ही सबसिस्टम हैं जो घटनाओं में रुचि रखते हैं, तो उन्हें उन घटनाओं के लिए देखने की लागत, जिनमें वे रुचि रखते हैं, एक सामान्य-उद्देश्य समर्पित निगरानी उपतंत्र स्थापित करने की लागत से कम हो सकती है, लेकिन ब्रेक-इवन विभिन्न प्लेटफार्मों के बीच बिंदु अलग-अलग होंगे।


0

एक घटना श्रोता एक कान की तरह एक संदेश के लिए इंतजार कर रहा है। जब घटना होती है, तो घटना श्रोता का उपयोग करते हुए घटना श्रोता के रूप में चुना गया सबरूटीन काम करता है।

हमेशा दो महत्वपूर्ण डेटा होते हैं: वह क्षण जहां घटना होती है और वह वस्तु जहां यह घटना होती है। अन्य तर्क यह है कि क्या हुआ के बारे में अधिक डेटा है।

ईवेंट श्रोता उस प्रतिक्रिया को निर्दिष्ट करता है जो होती है।


0

एक ईवेंट श्रोता प्रकाशन / सदस्यता पैटर्न (एक ग्राहक के रूप में) का अनुसरण करता है

अपने सरलतम रूप में, एक प्रकाशन वस्तु कुछ प्रकाशित होने की आवश्यकता होने पर ग्राहकों के निर्देशों की एक सूची बनाए रखती है।

इसमें कुछ प्रकार की subscribe(x)विधि होगी, जहां x इस बात पर निर्भर करता है कि ईवेंट हैंडलर को ईवेंट को संभालने के लिए कैसे डिज़ाइन किया गया है। जब सदस्यता (एक्स) कहा जाता है, तो एक्स को ग्राहकों के निर्देशों / संदर्भों की प्रकाशक सूची में जोड़ा जाता है।

प्रकाशक के पास घटना को संभालने के लिए तर्क के सभी, कुछ या कोई भी हो सकता है। जब यह घटना घटित होती है तो इसे सूचित करने या बदलने के लिए ग्राहकों को केवल संदर्भों की आवश्यकता होती है। इसमें कोई तर्क नहीं हो सकता है और ग्राहक वस्तुओं (विधियों / घटना श्रोताओं) की आवश्यकता हो सकती है जो घटना को संभाल सकते हैं। इसमें दोनों का मिश्रण होने की सबसे अधिक संभावना है।

जब कोई घटना होती है, तो प्रकाशक अपने आइटम के लिए अपने तर्क को ग्राहकों के निर्देशों / संदर्भों की सूची में दर्ज करेगा।

कोई फर्क नहीं पड़ता कि इवेंट हैंडलर कितना जटिल है, इसके मूल में यह इस सरल पैटर्न का अनुसरण करता है।

उदाहरण

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.