दिलचस्प पोस्ट
एंड्रॉइड पर उस फाइल में पाठ फ़ाइल कैसे बनाएं और डेटा डालें प्रॉक्सी के पीछे मेवेन और SSL का उपयोग करने में समस्याएं 'R +' और 'a +' के बीच अंतर क्या है जब अजगर में खुली फाइल? स्ट्रिंग के वैक्टर से संख्या निकालने टुकड़े के लिए मूल्यों की एक सूची पास shader सामान्य रूप से जावास्क्रिप्ट में कोड संगठन के आसपास सर्वोत्तम प्रथाओं को स्वीकार किया जाता है एकाधिक तर्क बनाम विकल्प ऑब्जेक्ट DllMain में एक धागा बनाना है? डेटा प्रोटोकॉल यूआरएल आकार की सीमाएं एक शाखा की तरह एक शाखा बनाने के लिए git कमांड क्या कोई यह बता सकता है कि BCrypt एक हैश कैसे सत्यापित करता है? मेरे एंड्रॉइड ऐप में टेक्स्टव्यू लिंक को संभाल लें क्यों स्विच / केस और नहीं अगर / अगर अन्यथा? क्या पायथन में कई पंक्तियों में एक लंबी रेखा को तोड़ना संभव है कैसे PHP में सरणी कुंजी नाम बदलने के लिए?

मैसेज पंप क्या है?

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

अद्यतन करें:

मेरा कार्यक्रम एक बड़ी संख्या में आरटीएफ फाइलों के माध्यम से चलाया जाता है ताकि एक चिकित्सा रिपोर्ट संख्या के निर्माण के लिए इस्तेमाल की जाने वाली जानकारी के दो टुकड़े निकाले जा सकें। आरटीएफ काम में स्वरूपण निर्देशों का प्रयास करने और समझने के बजाय, मैंने उन्हें वर्ड में खोलने और पाठ को वहां से खींचने का फैसला किया (वास्तव में जीयूआई शुरू करने के बिना) कभी-कभी, कार्यक्रम एक फ़ाइल को संसाधित करने के बीच में बाधित होता था, और उस दस्तावेज़ से जुड़ी एक वर्ड थ्रेड को छोड़ दिया (मुझे अभी भी पता है कि उसे कैसे बंद किया जाए)। जब मैं प्रोग्राम को दोबारा चला, निश्चित तौर पर मुझे एक अधिसूचना मिली कि उस फ़ाइल का इस्तेमाल करने वाला एक धागा था, और क्या मैं केवल पढ़ने के लिए एक कॉपी खोलना चाहता था? जब मैंने हां कहा, तो Word जीयूआई अचानक कहीं से ऊपर खड़ा हो गया और फाइलों को प्रसंस्करण शुरू कर दिया। मैं सोच रहा था कि ऐसा क्यों हुआ; लेकिन ऐसा लग रहा है जैसे संवाद बॉक्स में एक बार संदेश पंप को पॉप अप करने के लिए विंडोज़ के मुख्य जीयूआई को भी शुरू करना शुरू कर दिया?

वेब के समाधान से एकत्रित समाधान "मैसेज पंप क्या है?"

एक संदेश लूप कोड का एक छोटा सा टुकड़ा है जो किसी भी मूल विंडोज प्रोग्राम में मौजूद है। यह लगभग इस तरह दिखता है:

MSG msg; while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 

GetMessage () Win32 एपीआई विंडोज से एक संदेश प्राप्त करता है आपका कार्यक्रम आम तौर पर अपने समय का 99.99% खर्च करता है, विंडोज़ का इंतजार कर रहा है कि यह कुछ दिलचस्प हुआ। TranslateMessage () एक सहायक फ़ंक्शन है जो कुंजीपटल संदेशों का अनुवाद करता है। डिस्पेचमेल () यह सुनिश्चित करता है कि विंडो प्रक्रिया को संदेश के साथ बुलाया जाता है

हर जीयूआई सक्षम एनएटी प्रोग्राम में एक संदेश लूप है, यह एप्लिकेशन द्वारा शुरू किया गया है.रन ()।

कार्यालय में संदेश लूप की प्रासंगिकता COM से संबंधित है ऑफिस प्रोग्राम्स कॉम-सक्षम प्रोग्राम हैं, इस प्रकार Microsoft.Office.Interop वर्ग कैसे काम करते हैं कॉम COM कॉलस की ओर से थ्रेडिंग का ख्याल रखता है, यह सुनिश्चित करता है कि कॉम इंटरफ़ेस पर किए गए कॉल हमेशा सही धागा से बने होते हैं। अधिकांश COM वर्गों में रजिस्ट्री में एक रजिस्ट्री कुंजी है जो उनके थ्रेडिंग मॉडेल को घोषित करता है, अब तक सबसे आम लोगों (कार्यालय सहित) "अपार्टमेंट" का उपयोग करते हैं। इसका मतलब है कि इंटरफ़ेस पद्धति को कॉल करने का एकमात्र सुरक्षित तरीका यही है कि क्लास ऑब्जेक्ट को बनाए गए एक ही धागे से कॉल कर। या इसे किसी अन्य तरीके से स्थापित करने के लिए: सबसे अधिक कॉम क्लास द्वारा धागा-सुरक्षित नहीं हैं

प्रत्येक COM सक्षम थ्रेड COM अपार्टमेंट से संबंधित है। दो प्रकार के हैं, सिंगल थ्रेडेड अपार्टमेंट्स (एसटीए) और मल्टी थ्रेड अपार्टमेंट (एमटीए)। एसएटीए धागा पर एक अपार्टमेंट थ्रेडेड कॉम क्लास बनाया जाना चाहिए। आप इसे वापस एनआईटी प्रोग्राम में देख सकते हैं, विंडोज फार्म या WPF प्रोग्राम के यूआई थ्रेड का प्रवेश बिंदु [STAThread] विशेषता है। अन्य धागे के लिए मॉडल मॉडल थ्रेड द्वारा सेट किया गया है। SetApartmentState () विधि।

अगर विंडोज़ थ्रेड एसटीए नहीं है तो विंडोज प्लंबिंग का बड़ा हिस्सा सही तरीके से काम नहीं करेगा। विशेषकर ड्रैग ड्रैप, क्लिपबोर्ड, विंडोज संवाद जैसे ओपनफाइल डायलॉग। और किसी भी ActiveX नियंत्रण और अधिकांश COM सर्वर, जैसे कार्यालय

एसटीए धागा के लिए एक कठिन आवश्यकता यह है कि इसे कभी भी ब्लॉक नहीं करना चाहिए और संदेश लूप को पंप करना चाहिए। संदेश लूप महत्वपूर्ण है क्योंकि COM है जो एक इंटरफ़ेस विधि कॉल को एक धागे से दूसरे में मार्शल करने के लिए उपयोग करता है यद्यपि .NET marshaling कॉल को आसान बनाता है (उदाहरण के लिए Control.BeginInvoke या Dispatcher.BeginInvoke), यह वास्तव में करने के लिए एक बहुत ही मुश्किल काम है कॉल निष्पादित करने वाला थ्रेड एक प्रसिद्ध राज्य में होना चाहिए। आप केवल एक सूत्र को बाधित नहीं कर सकते हैं और इसे विधि कॉल करने के लिए मजबूर कर सकते हैं, जिससे भयानक फिर से प्रवेश की समस्याएं पैदा हो सकती हैं। एक धागा "निष्क्रिय" होना चाहिए, जो किसी भी कोड को निष्पादित करने में व्यस्त नहीं है जो प्रोग्राम की स्थिति को बदल रहा है।

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

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

विकिपीडिया का मूल विवरण है

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

प्रत्येक एप्लिकेशन के लिए पर्दे के पीछे एक मैसेजिंग सिस्टम होता है जहां प्रत्येक विंडो अन्य खिड़कियों या ईवेंट श्रोताओं को ईवेंट भेज सकती है – यह संदेश कतार में एक संदेश जोड़कर कार्यान्वित किया जाता है एक मुख्य लूप है जो हमेशा इस संदेश कतार को देखकर चलता रहता है और फिर श्रोताओं को संदेशों (या घटनाओं) को प्रेषित करता है

माइक्रोसॉफ्ट विंडोज में विकिपीडिया लेख मेसेज लूप एक मूल विंडोज प्रोग्राम का उदाहरण कोड दिखाता है – और जैसा कि आप सबसे बुनियादी स्तर पर देख सकते हैं एक विंडोज़ प्रोग्राम सिर्फ "संदेश पंप" है

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

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

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

.NET-COM एकीकरण स्वयं एक संपूर्ण विषय है, और इस विषय पर लिखे गए पुस्तकें भी हैं। यहां तक ​​कि एक इंटरैक्टिव डेस्कटॉप एप्लिकेशन से कार्यालय के लिए COM API का उपयोग करने के लिए आपको हुप्स के माध्यम से कूदना और यह सुनिश्चित करना होगा कि संदर्भ स्पष्ट रूप से रिलीज़ किए गए हैं।

कार्यालय को थ्रेड-असुर माना जा सकता है, इसलिए आपको प्रत्येक थ्रेड के लिए Word, Excel या अन्य Office अनुप्रयोगों की एक अलग आवृत्ति की आवश्यकता होगी। आपको प्रारंभिक ओवरहेड करना होगा या एक थ्रेड पूल बनाए रखना होगा। यह सुनिश्चित करने के लिए कि सभी COM संदर्भ सही ढंग से रिलीज़ किए गए थे, एक थ्रेड पूल को सावधानीपूर्वक परीक्षण करना होगा। यहां तक ​​कि शुरू और बंद करने के उदाहरणों को यह सुनिश्चित करने की आवश्यकता है कि सभी संदर्भ सही तरीके से जारी किए गए हैं। आपके आईटी को डॉट करने में विफलता है और आपके टी को यहां पार करने में बड़ी संख्या में मृत COM ऑब्जेक्ट होंगे और वर्ड का लीक होने के पूरे चलने वाले उदाहरण भी होंगे

विकिपीडिया का सुझाव है कि इसका मतलब कार्यक्रम की मुख्य इवेंट लूप है ।

मुझे लगता है कि इस चैनल 9 चर्चा में एक संक्षिप्त संक्षिप्त व्याख्या है:

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