2010-03-29 8 views
8

लक्ष्यलिए सबसे कारगर तरीका भर में छवियों को भेजने के लिए

पास एक प्रक्रिया कुशलता से और एक अन्य प्रक्रिया के लिए बहुत उच्च गति से उत्पन्न छवियों संसाधित करता है। दो प्रक्रियाएं एक ही मशीन पर और उसी डेस्कटॉप पर चलती हैं। ऑपरेटिंग सिस्टम WinXP, Vista और Win7 हो सकता है।

विस्तृत विवरण

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

नोट: पहले से ही दो प्रक्रियाओं के बीच एक कनेक्शन खुला है। वे अज्ञात पाइप के माध्यम से संचार कर रहे हैं और मेमोरी मैप किए गए फ़ाइल दृश्य साझा करते हैं।

विचार

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

आपके विचार क्या हैं? मैं इस पर हर विचार की सराहना करता हूं!

+1

यदि छवि प्रति सेकंड कई सौ बार अपडेट की जा रही है, तो आप छवि प्रसंस्करण के विपरीत उच्च बैंडविड्थ वीडियो डेटा को संभालने के लिए किसी भी मौजूदा वीडियो प्रोसेसिंग तकनीकों को देखना चाह सकते हैं। –

उत्तर

1

ठीक है ऐसा लगता है जैसे मेमोरी मैप की गई फ़ाइलें और पाइप जाने का सही तरीका है। यह बहुत बुरा नहीं है क्योंकि दो प्रक्रियाएं पहले से ही एक एमएमएफ और दो पाइप साझा करती हैं (बिडरेक्शनल संचार के लिए)। हल करने के लिए छोड़ी गई एकमात्र चीज़ यह थी कि डेटा को जितना संभव हो सके छोटे कॉपी ऑपरेशन के साथ पास करना है।

डिजाइन जो बहुत अच्छी तरह से काम करता है के रूप में (अनुक्रमिक प्रवाह) इस प्रकार है:

प्रक्रिया 1

  • दे संकेत 2 कार्रवाई करने के लिए (छवि चाहता है) (पाइप के माध्यम से 1) साझा स्मृति में छवि को संग्रहित करने

प्रक्रिया 2 (चित्र प्रदान करता है)

(पाइप 2 से पढ़ने के अवरुद्ध)
  • सोने और प्रतिक्रिया के लिए प्रतीक्षा करने के लिए जाना
      संकेत पर
    • जगा और HDC 1 को पेंट करने के लिए हार्डवेयर डिवाइस बता (पाइप 1 के माध्यम से) (इसे साझा स्मृति के द्वारा समर्थित है, नीचे देखें)
    • 1 पर कार्रवाई करने के संकेत दे (के माध्यम से पाइप 2)
    • सोने और नई नौकरी के लिए इंतजार

    प्रक्रिया 1 (पाइप 1) के माध्यम से करने के लिए जाना (चाहता है छवि)

      संकेत पर
    • (पाइप के माध्यम से 2) जाग और गंतव्य के लिए साझा स्मृति से रंग HDC 2

    अब साझा स्मृति के माध्यम से छवि हस्तांतरण के लिए (मेरा लक्ष्य एक से अधिक नहीं अतिरिक्त प्रतिलिपि आपरेशन का इस्तेमाल किया गया):

    प्रक्रिया 2 एक HBITMAP बनाता CreateDIBSection के माध्यम से और फ़ाइल मानचित्रण और ऑफसेट के हत्थे प्रदान करता है मैप किए गए दृश्य का। इस प्रकार छवि डेटा साझा स्मृति में रहता है। यह के रूप में वर्णित एक HBITMAP जो HDC 1 (जो भी इस प्रक्रिया 2 द्वारा बनाई गई है) में चयन किया जाता है और जो प्रक्रिया द्वारा अब से उपयोग किया जाएगा 2.

    प्रक्रिया 1 मैप किया दृश्य की स्मृति में एक सूचक के साथ StretchDIBits का उपयोग करता है बनाता है (here)। स्मृति से बिट्स को सीधे किसी अन्य एचडीसी में प्राप्त करने के लिए यह एकमात्र कार्य प्रतीत होता है (इस मामले में एचडीसी 2)। इससे पहले कि आप उन्हें वहां से अंतिम एचडीसी में स्थानांतरित कर सकें, अन्य कार्य उन्हें पहले मध्यस्थ बफर में कॉपी करेंगे।

    तो अंत में ऐसा लगता है कि स्थानांतरित होने के लिए आवश्यक बिट्स शुरुआत में लगभग दोगुनी हैं। लेकिन मुझे लगता है कि यह तब तक अच्छा है जब तक प्रक्रियाओं के बीच जीडीआई हैंडल साझा करना संभव नहीं होगा।

    नोट: मैंने संकेतों के बजाय पाइप का उपयोग किया क्योंकि मुझे कुछ अतिरिक्त डेटा भी स्थानांतरित करने की आवश्यकता है।

  • 11

    Memory Mapped File का उपयोग करें।

    डेल्फी संदर्भ के लिए Memory-mapped Files in Delphi और Shared Memory in Delphi देखें।

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

    +0

    हाँ, मैं इसे मेमोरी मैप की गई फ़ाइल के साथ कर सकता हूं। मुझे अभी भी अपनी एचडीसी में छवि पेंट करना होगा, छवि को एमएमएफ में क्रमबद्ध करना होगा, उन्हें दूसरी ओर फिर से पढ़ना होगा और अंतिम एचडीसी में छवि पेंट करना होगा। 4 कॉपी ऑपरेशंस की तरह लगता है जहां केवल 1 होता था। इस प्रकार मैं एक और अधिक प्रभावी तरीका ढूंढ रहा हूं। लेकिन अगर कोई नहीं है तो मुझे लगता है कि जाने का तरीका है। –

    4

    हैंडओवर समन्वय करने के लिए छवि डेटा को पास करने के लिए साझा स्मृति का उपयोग करें, और कुछ और (नामित पाइप, सॉकेट, ...)।

    3

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

    तो स्मृति मुझे सही ढंग से कार्य करता है, मेरा मानना ​​है कि अगर HBITMAP GDI समारोह से एक के साथ आवंटित किया गया था यह काम करेगा (CreateBitmap, CreateCompatibleBitmap, CreateDIBitmap, आदि ...) HBIMAP LoadBitmap द्वारा बनाई हैंडल के रूप में यह एक बस है काम नहीं करेगा एक इन-प्रो संसाधन के लिए सूचक।

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

    कम से कम मुझे याद है। हम भाग्यशाली हो गए क्योंकि हमारे ग्राफिक पुस्तकालयों को पहले से ही सभी छवियों को एचबीआईटीएमएपी के प्रबंधन के लिए लिखा गया था।

    YMMV

    +0

    +1 इसका उपयोग नहीं करेगा, लेकिन फिर भी दिलचस्प है। –

    +1

    यह वास्तव में दिलचस्प है, हालांकि मैं भी बुरा महसूस किए बिना इसका उपयोग नहीं कर सका। ऐसा लगता है कि प्रक्रियाओं में जीडीआई हैंडल को जुआ करना थोड़ा जुआ जैसा है - इसे काम नहीं करना चाहिए, लेकिन ऐसा लगता है कि कभी-कभी ऐसा लगता है। (Http://stackoverflow.com/questions/2499487/sharing-hdc-between- अलग-अलग- प्रोसेसिस देखें जहां मैंने पहले इस दृष्टिकोण के बारे में पूछा था, क्योंकि मुझे उम्मीद थी कि यह आसान होगा।) –

    +0

    लेकिन इसके बारे में क्या: http://stackoverflow.com/a/2500975/893350 मैंने कोशिश की और मुझे "जीडीआई + में एक सामान्य त्रुटि आई।" ErrCode: -2147467259 –

    0

    मैं इस देख सकते हैं, आप दो विकल्प हैं:

    1. पास केवल छवि संभाल/सूचक अन्य प्रक्रिया के लिए है, इसलिए दोनों प्रक्रियाओं छवियों में से एक संग्रह पर ही काम करते हैं।
    2. छवि सामग्री को अन्य प्रक्रिया में कॉपी करें और तब से एक प्रतिलिपि पर काम करें।

    कौन सा दृष्टिकोण आपके डिजाइन पर सबसे अच्छा निर्भर करता है। दोनों दृष्टिकोणों के लिए सबसे अच्छा टूल "स्मृति मैप की गई फ़ाइलें" या "नामित पाइप" होगा। यह सबसे तेज़ है जो आप प्राप्त कर सकते हैं। मेमोरी मैप की गई फाइलें प्रोसेसल इंटर प्रोसेस संचार का सबसे तेज़ रूप है लेकिन डॉनवाइड है कि उनमें कोई "क्लाइंट-सर्वर" प्रतिमान नहीं है। तो आपको अपने आप को एमएमएफ में acces सिंक्रनाइज़ करना होगा। दूसरी तरफ नामित पाइप लगभग तेज़ होते हैं लेकिन क्लाइंट-सर्वर प्रतिमान उनमें सही बनाते हैं। गति में अंतर मुख्य रूप से उस से आता है।

    अब अपडेट की शेयर गति की वजह से, पहला दृष्टिकोण बेहतर हो सकता है, लेकिन फिर आपको प्रक्रियाओं के बीच सिंक्रनाइज़ेशन के लिए देखना होगा, इसलिए वे एक ही समय में एकल छवि को पढ़/लिख नहीं सकते हैं। इसके अलावा कुछ प्रकार के कैशिंग या अन्य स्मार्ट टेक्निक्स का उपयोग किया जा सकता है, ताकि आप कम से कम अपने ट्रैफिक को कम कर सकें। ऐसे उच्च स्तर के संचार का सामना करते समय हमेशा उस स्तर को कम करने के साधनों को देखने के लिए सलाह दी जाती है।

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

    +0

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

    +0

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