घटना-संचालित प्रोग्रामिंग

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

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

एक तुच्छ घटना संचालक
क्योंकि घटनाओं की जाँच के लिए कोड और मुख्य लूप अनुप्रयोगों के बीच सामान्य हैं, कई प्रोग्रामिंग ढांचे उनके कार्यान्वयन का ध्यान रखते हैं और आशा करते हैं कि उपयोगकर्ता एकमात्र ईवेंट हैंडलर्स के लिए कोड प्रदान करें। इस सरल उदाहरण में, किसी इवेंट हैंडलर को कॉल किया जा सकता है OnKeyEnter जिसमें वर्णों की एक स्ट्रिंग के साथ एक तर्क सम्मलित होता है, जो उपयोगकर्ता द्वारा ENTER KEY को हिट करने से पहले टाइप किया गया था। दो नंबर जोड़ने के लिए, ईवेंट हैंडलर के बाहर स्टोरेज का उपयोग किया जाना चाहिए। कार्यान्वयन नीचे जैसा दिख सकता है।

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

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

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

इवेंट-संचालित प्रोग्राम विकसित करने में तीसरा चरण मुख्य लूप लिखना है। यह एक ऐसा फ़ंक्शन है जो घटनाओं की जांच करता है, और उसके बाद इसे संसाधित करने के लिए मिलान करने वाले ईवेंट हैंडलर को कॉल करता है। अधिकांश इवेंट-संचालित प्रोग्रामिंग वातावरण पहले से ही इस मुख्य लूप को प्रदान करते हैं, इसलिए इसे विशेष रूप से एप्लिकेशन प्रोग्रामर द्वारा प्रदान करने की आवश्यकता नहीं है। [ आईबीएम आरपीजी], IBM की एक प्रारंभिक प्रोग्रामिंग भाषा, जिसकी 1960 के दशक की डिजाइन अवधारणा ऊपर चर्चा की गई घटना-संचालित प्रोग्रामिंग के समान थी, एक अंतर्निहित मुख्य I/O लूप प्रदान करती है (प्रोग्राम चक्र के रूप में जाना जाता है) जहां गणना 'संकेतक' के अनुसार प्रतिक्रिया देती है। ' (ध्वज कंप्यूटिंग) जो पहले चक्र में स्थापित किए गए थे।

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

सामान्य उपयोग
अधिकांश उपस्थित जीयूआई विकास उपकरण और आर्किटेक्चर इवेंट-संचालित प्रोग्रामिंग पर भरोसा करते हैं। Java AWT फ्रेमवर्क सभी UI परिवर्तनों को एक थ्रेड पर प्रोसेस करता है, जिसे घटना प्रेषण धागा कहा जाता है। इसी प्रकार, जावा फ्रेमवर्क JavaFX में सभी UI अपडेट JavaFX एप्लिकेशन थ्रेड पर होते हैं।

इसके अतिरिक्त, Node.js जैसे प्रणाली भी इवेंट-संचालित हैं।

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

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

यह भी देखें

 * स्वायत्त परिधीय संचालन
 * प्रोग्रामिंग प्रतिमान की समानता
 * डेटाफ्लो प्रोग्रामिंग (एक समान अवधारणा)
 * डोम इवेंट्स
 * घटना संचालित वास्तुकला
 * इवेंट स्ट्रीम प्रोसेसिंग (एक समान अवधारणा)
 * हार्डवेयर विवरण भाषा
 * बाधा डालना
 * नियंत्रण का उलटा
 * संदेश उन्मुख मिडलवेयर
 * प्रोग्रामिंग प्रतिमान
 * प्रकाशित-सदस्यता पैटर्न
 * रिएक्टर पैटर्न
 * सिग्नल प्रोग्रामिंग (एक समान अवधारणा)
 * मंचित [[घटना-संचालित वास्तुकला]] (SEDA)
 * समय-ट्रिगर प्रणाली (कंप्यूटर प्रणाली के लिए एक वैकल्पिक आर्किटेक्चर)
 * आभासी तुल्यकालन, इवेंट-संचालित प्रोग्रामिंग के लिए एक वितरित निष्पादन मॉडल

बाहरी संबंध

 * Concurrency patterns presentation given at scaleconf
 * Event-Driven Programming: Introduction, Tutorial, History, tutorial by Stephen Ferg
 * Event-Driven Programming, tutorial by Alan Gauld
 * Event Collaboration, article by Martin Fowler
 * Rethinking Swing Threading, article by Jonathan Simon
 * The event-driven programming style, article by Chris McDonald
 * Event Driven Programming using Template Specialization, article by Christopher Diggins
 * Event-Driven Programming and Agents, chapter
 * LabWindows/CVI Resources
 * Distributed Publish/Subscribe Event System, an open-source example which is in production on MSN.com and Microsoft.com
 * Javascript Event loop
 * Javascript Event loop