मान लें कि फ़ंक्शन foo() निष्पादित हो रहा है। मान लीजिए कि एक बाहरी घटना होती है, जिसके लिए आपके पास हैंडलर होता है। फू() को बाधित कर देगा ताकि ईवेंट हैंडलर को निष्पादित किया जा सके? इस स्थिति में निष्पादन का आदेश क्या है?क्या किसी ईवेंट को प्रेषित करना फ़ंक्शन को बाधित करता है?
उत्तर
यह वास्तव में मुश्किल हो सकता है।
मुझे नहीं पता कि फ्लैश इस संबंध में कैसे काम करता है, लेकिन उदाहरण के लिए सी # में कुछ मामले हैं। मेरा सुझाव है कि आप इस बात को पढ़ते हैं कि यह सामान कैसे काम करता है। डीबगर में तोड़ना और स्टैक की जांच करना भी अच्छा है जिससे आपके इवेंट हैंडलर को इसका एहसास हो गया।
असल में वहाँ दो स्थितियों में से एक चल रहा है:
तरह Dr_Asik कहते हैं, तो आप सीधे एक प्रतिनिधि घटना है, जो वास्तव में एक विधि तुल्यकालिक बुला की तरह है लागू हो सकता है। इस मामले में, धागे संदर्भ-स्विचिंग के बारे में सामान्य नियम लागू होते हैं, लेकिन एक घटना में कोई विशेष गुण नहीं है, वास्तव में। यह सिर्फ एक समारोह कॉल है।
आप यूआई फॉर्म ईवेंट के बारे में बात कर सकते हैं। इस मामले में, कुछ विशेष नियम लागू होते हैं। एक यूआई घटना को सिंक्रनाइज़ निष्पादित करने के बजाए ईवेंट कतार में "पोस्ट" किया जाता है। तो अगर foo() "मुख्य" यूआई थ्रेड पर है, तो उपयोगकर्ता foo() चल रहा है, जबकि कुंजी दबाता है, फिर कीप्रेस ओएस द्वारा फंस जाती है और एप्लिकेशन की यूआई इवेंट कतार में पोस्ट की जाती है। लेकिन foo() पहले से चल रहा है, इसलिए मुख्य धागा रुक जाएगा और उस कतार की जांच नहीं करेगा। केवल एक बार foo() का पूरा कॉल स्टैक संदेश कतार जांच लूप पर सभी तरह से पूरा करता है, मुख्य धागा उस संदेश को ढूंढता है, इसे संसाधित करता है, और इसके हैंडलर को आमंत्रित करता है।
स्पष्ट होने के लिए, अंतिम मामले में foo() को UI ईवेंट द्वारा बाधित नहीं होने की गारंटी है।
हालांकि, यदि 2 में एक और परिदृश्य है, जहां foo() मुख्य UI थ्रेड पर नहीं है। इस मामले में, सामान्य संदर्भ स्विचिंग द्वारा इसे पूरी तरह से बाधित किया जा सकता है।
सी # में यदि आप Control.Invoke() का उपयोग शुरू करते हैं तो यह भी अधिक कठिन हो सकता है।
यह फ़्लैश-विशिष्ट नहीं है लेकिन मुझे उम्मीद है कि इससे मदद मिलती है। मुझे संदेह है कि फ्लैश का एक मुख्य धागा एक इवेंट कतार और प्रसंस्करण पाश है, जैसे सी #। यह एक आम मॉडल है जिसे आप कम से कम सी #, जावा और डेल्फी में पाते हैं।
+1। अच्छा recap। –
प्रश्न के लिए प्रासंगिक नहीं है। प्रश्न फ़्लैश प्लेयर पर लक्षित है। –
@ बग-ए-लॉट। लेकिन वर्णित मॉडल फ़्लैश प्लेयर पर लागू है। –
नहीं, foo()
बाधित नहीं होगा।
फ्लेक्स एकल-थ्रेडेड है, इसलिए foo()
चलना जारी रहेगा। एक बार foo() खत्म हो जाता है और इवेंट लूप पर नियंत्रण वापस कर दिया जाता है, तो ईवेंट कतार में पहली घटना संसाधित की जाएगी।
यह सही है लेकिन मुझे थोड़ा सा स्पष्टीकरण दें। फ्लैश प्लेयर में कोड निष्पादन एकल थ्रेडेड है। तो फ्लेक्स ऐप्स एक थ्रेड पर चलते हैं। लेकिन फ्लैश प्लेयर में चीजें हैं जो अलग-अलग धागे जैसे नेटवर्क आईओ पर चलती हैं - ताकि नेटवर्क अनुरोध यूआई को अवरुद्ध न करें। –
मुझे डर है कि यह सभी घटना प्रेषण के लिए सच नहीं है। घटना तंत्र अंतर्निहित असीमित नहीं है।यह वास्तव में कॉलबैक के लिए उबलता है। यह सच है कि प्लेयर के एपीआई द्वारा भेजे गए अधिकांश कार्यक्रमों को असीमित रूप से निकाल दिया जाता है, हालांकि, उपयोगकर्ता जेस्चर, फ्लैश.net पैकेज आदि द्वारा उत्पन्न किए गए लोगों की तरह –
जैसा भी हो सकता है, उपयोगकर्ता के विशेष प्रश्न का उत्तर अभी भी "नहीं , यह बाधित नहीं होगा "। ब्रांड नए ईवेंट के लिए उपयोगकर्ता का ईवेंट हैंडलर तब भी निष्पादित नहीं किया जाएगा जब तक foo() पूर्ण नहीं हो जाता। –
यहाँ एक और "सूत्र" एकल थ्रेड में चल रहे एप्लिकेशन फ्लेक्स से संबंधित है: http://stackoverflow.com/questions/1108772/flex-single-threaded-model-are-you-kidding-me - जेम्स –