2012-07-25 7 views
10

मैं उचित कोडिंग में कुछ सलाह की जरूरत होती हूँ:अच्छा कोडिंग? (एकाधिक संदेश लूप्स)

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

वर्तमान में, जब मैं धागे बनाते हैं, तो मैंने उन पर एक संदेश लूप बनाने के लिए चुना है (एप्लिकेशन.रुन()), इसलिए बफर मतदान करना और कोई काम नहीं होने पर, मैं बस थ्रेड (BeginInvoke) का उपयोग करता हूं और उपयोग करता हूं एक बफर के रूप में संदेश पाश। यह वर्तमान में अच्छी तरह से काम करता है, और अब तक कोई गंभीर समस्या नहीं है।

मेरा प्रश्न है अब: इस "अच्छा कोडिंग" किसी तीसरे बात है, या मैं बजाय चलने पर थोड़ी देर के पाश का उपयोग करें और मतदान बफ़र्स होना चाहिए ?, या?

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

धन्यवाद।

उत्तर

4

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

+0

वास्तव में नहीं, नहीं। WM_COPYDATA प्रक्रियाओं के बीच संचार के लिए ठीक है। यह एक प्रक्रिया के अंदर इंटर-थ्रेड कॉम के लिए इसका उपयोग कर व्यर्थ है। बफर/ब्लॉब/पॉइंटर द्वारा जो भी ऑब्जेक्ट्स पास करना है, उदाहरण के लिए यह बहुत आसान/सरल है। संदेश के लिए * बफर कास्टिंग करके।एलपीराम, पोस्टमेसेज() आईएनजी और 'अन्य छोर' पर वापस कास्टिंग। –

+0

विंडोज संदेश कतारों को GUI थ्रेड्स को संचारित करने के लिए अनुकूलित किया गया है। जीयूआई धागे से गैर-जीयूआई कार्य धागे से संचार करने के लिए इष्टतम नहीं हैं। यहां तक ​​कि एक साधारण सेमफोर-आधारित, गैर-अनुकूलित उत्पादक-उपभोक्ता कतार WMQ की तुलना में लगभग चार गुना तेज है। अधिकांश ऐप्स में, पी-सी कतार प्रदर्शन सामान्य रूप से एक मुद्दा नहीं है। –

+0

मैं वास्तव में दोनों बिंदुओं पर सहमत हूं। मैं WM_COPYDATA संपादित कर दूंगा; मैं स्पष्ट रूप से सोच नहीं रहा था। संदेश कतार के संबंध में हालांकि, यह एक सामान्यीकृत घटना-आधारित समाधान है। अपने ऐप की आवश्यकताओं के आधार पर, अन्य मॉडल बेहतर हो सकते हैं। – tenfour

1

मैं कर रहा हूँ% नहीं 100 यकीन है कि क्या तुम यहाँ 'में भरने' का एक सा के साथ कर रहे हैं लेकिन, यह नहीं लग रहा बुरा :)

जब आपके एप्लिकेशन निष्क्रिय है, (कोई संचारों), है सीपीयू 0% उपयोग करते हैं?

क्या आपका ऐप नींद से मुक्त है (0)/नींद (1), या इसी तरह, मतदान लूप?

क्या यह एक उचित कम विलंबता के साथ काम करता है?

जवाब तीन हैं, तो 'हां', आप ठीक होना चाहिए :)

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

+0

इस कार्यक्रम का उद्देश्य 1-4 (अब तक) बक्से को नियंत्रित करना है, प्रत्येक में एक Arduino युक्त है। प्रत्येक Arduino एक सिम्युलेटर सिस्टम के डिजिटल I/O से जुड़ा हुआ है। समांतर सिम्युलेटर सिस्टम को एक बॉक्स पीआर की आवश्यकता होती है। सिम्युलेटर। सिमुलेटर कंपनी में आर एंड डी का हिस्सा है जहां मैं काम करता हूं। विंडोज प्रोग्राम में पिन के उच्च/निम्न राज्यों को पढ़ने/लिखने के साथ रनटाइम समय पर अरुडिनो पिनआउट को पुन: प्रोग्राम करने की क्षमता है। – Anders

+0

यहां से ट्रिपल हां .. मैंने कोड को बफर मतदान के रूप में बदलने की कोशिश की, थ्रेड.इल्ड के साथ कोई डेटा नहीं, और इसने प्रोग्राम को थोड़ा कम किया, इसलिए मुझे लगता है कि मैं संदेश लूप के साथ ठीक हूं :) – Anders

+0

ठीक है, मैंने शायद कुछ अलग कतारों का उपयोग किया हो सकता है, लेकिन यदि आप ऐप पर्याप्त कुशल हैं, तो त्वरित प्रतिक्रिया देता है और क्रैश नहीं होता है, जो परवाह करता है :)) –

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