2010-02-16 8 views
7

ठीक है, मुझे संदेह है कि मुझे इसे शब्दों में डालने में कठिनाई हो रही है क्योंकि COM और अपार्टमेंट की मेरी समझ वास्तव में नौकरी तक नहीं है ;-)मैं अपने मुख्य-एसटीए COM सर्वर (सी ++) में कोई पुनः प्रवेश करने की अनुमति कैसे सुनिश्चित करूं?

मेरे पास एक COM इन-प्रोसेस सर्वर/घटक है (सी ++) जो कुछ विरासत कोड लपेटता है। इस विरासत कोड मैं यह सुनिश्चित करें कि COM घटक के तरीके हैं की जरूरत है की सीमाओं के कारण:

  1. केवल एक ही धागे पर कहा जाता है।
  2. यह हमेशा सर्वर के सभी उदाहरणों के लिए एक ही धागा है।
  3. (जिसे मैंने बाद में महसूस किया) कोई पुन: प्रवेश कॉल नहीं।

पहले दो मैंने सर्वर को थ्रेडिंगमोडेल = "" के साथ पंजीकृत करके हासिल किया।

तीसरी समस्या एक समस्या है जिसे मुझे सामना करने के लिए भी आश्चर्यचकित किया गया था।

सर्वर का उपयोग बहु-थ्रेडेड क्लाइंट द्वारा किया जा रहा है जिसका मेरा कोई नियंत्रण नहीं है। यह विभिन्न धागे पर सर्वर/घटक के कई उदाहरण बना रहा है और अपनी DoSomething() विधि को बुला रहा है।

यह फांसी और दुर्घटनाग्रस्त व्यवहार के चयन की ओर अग्रसर है और मैंने मुख्य-एसटीए थ्रेड पर दो कॉलों के साथ दो कॉल वाले स्टैक निशान देखे हैं, लेकिन सर्वर के विभिन्न उदाहरणों के लिए।

मैंने शुरू में यह भी नहीं सोचा था कि यह संभव था, लेकिन अब मुझे आंशिक समझ है और मुझे यह जानने की जरूरत है कि इसे कैसे/कैसे रोका जा सकता है।

मेरी पढ़ाई से पता चलता है कि मुझे कुछ फैशन में IMessageFilter का उपयोग करने की आवश्यकता हो सकती है, लेकिन मुझे यकीन नहीं है कि यह ऐसा कुछ है जो सर्वर के पक्ष में किया जा सकता है, या ग्राहक द्वारा किया जाना चाहिए।

क्या कोई मदद कर सकता है?

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

उत्तर

5

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

तकनीकी तौर पर, फिर से entrancy भी हो सकता है जब आपके सर्वर एक यूआई संदेशों ही पंप से जीवित रखने के लिए कोशिश कर रहा है कर सकते हैं।

हां, यह बहुत से निपटने के लिए मुश्किल हो सकता है। मुझे इसके लिए किसी भी जादू फिक्स के बारे में पता नहीं है, और मैं थोड़ी देर के लिए कड़ी मेहनत कर रहा हूं। मैंने IMessageFilter को भी देखा और निष्कर्ष निकाला कि यह समस्या हल करने के लिए बेकार था।

3

को रोकने के लिए एक सामान्य फैशन में पूरी तरह से फिर से प्रवेश करना सीएम मार्शलिंग लागू करने के तरीके के कार्यान्वयन के लगभग असंभव साबित हो सकता है, क्योंकि नोबगज़ ने पहले से ही वर्णन किया है।मुझे लगता है कि का पता लगाने के लिए यह संभव है या तो मैन्युअल रूप से या कस्टम "प्रॉक्सी" का उपयोग करके (उदाहरण के लिए The Guts of the Universal Delegator कीथ ब्राउन द्वारा जांचें)।

बस एक विचार हालांकि: यदि आपकी COM ऑब्जेक्ट हमेशा एसटीए में चलनी चाहिए, और केवल अन्य अपार्टमेंट (यानी एमटीए) में चल रहे क्लाइंट से कॉल किया जाता है, तो शायद आप custom marshalling पर पढ़ सकते हैं (चेतावनी: बेहोशी के लिए नहीं दिल)। चूंकि आपके विरासत कोड में मुख्य एसटीए में चलाने की कोई आवश्यकता नहीं है, या विशेष रूप से जीयूआई घटकों के साथ बातचीत करने के लिए यह एक विकल्प साबित हो सकता है।

2

जैसा कि nobugz बताता है, यह संदेश लूप के कारण एक समस्या है।

मैं शायद COM ऑब्जेक्ट के अंदर इसे हल करने के लिए देखता हूं। यह निर्भर करता है कि आपकी कॉल कितनी जटिल हैं लेकिन आप अपने COM ऑब्जेक्ट के अंदर एक कार्य कतार रखने पर विचार कर सकते हैं जिसे आपके नियंत्रण में मौजूद एक थ्रेड द्वारा संसाधित किया जाता है। फिर आप अपने इनपुट पैरामीटर को कतार में पोस्ट किए गए डेटा ब्लॉक में मैन्युअल रूप से मार्शल करते हैं, तो आपका COM कॉल तब आपके 'प्रति कॉल' कस्टम क्यूइंग डेटा स्ट्रक्चर में किसी ईवेंट पर ब्लॉक करता है। जब कॉल को आपके काम कतार को संसाधित करने वाले एक थ्रेड पर संसाधित किया जाता है, तो आप पैरामीटर निकालते हैं, कॉल करते हैं और फिर परिणाम को कस्टम डेटा संरचना में पैकेज करते हैं और ईवेंट सेट करते हैं ... आपका कॉम कॉल अब चीजों को अनपैक कर सकता है और वापस आ सकता है।

बेशक शैतान विस्तार से है। मैं कस्टम कतार बनाने के लिए व्यक्तिगत रूप से एक आईओसीपी का उपयोग करता हूं लेकिन यह केवल एक कार्यान्वयन विस्तार है।

हाँ आप अधिक काम कर रहे हैं लेकिन अपनी आवश्यकताओं को देखते हैं (सभी कॉल करने के लिए एक थ्रेड और कोई पुनर्वित्त नहीं) यह संभवतः यह करने का सबसे विश्वसनीय तरीका है। इसके बाद, आप निश्चित रूप से वास्तविक COM ऑब्जेक्ट के लिए एसटीए आवश्यकताओं को छोड़ सकते हैं क्योंकि आपने थ्रेडिंग जागरूक ऑब्जेक्ट बनाया है जो कि किसी भी अपार्टमेंट में चलाया जा सकता है ...

संबंधित मुद्दे