2010-01-19 15 views
6

यहां मेरी समस्या है: मुझे सीरियल पर डिवाइस भेजने और प्राप्त करने में सक्षम होना चाहिए। यह एक बहु थ्रेडेड फैशन में किया जाना है। प्रवाह इस प्रकार है:डिवाइस से बात करने के लिए निर्माता/उपभोक्ता सीरियल

  1. डिवाइस के लिए प्रतीक्षा करें मुझे कुछ भेजने के लिए - या निष्क्रिय हैं, तो यदि डिवाइस के साथ ऑनलाइन देखने के लिए स्थिति को क्वेरी

  2. डिवाइस मुझे कुछ है, तो प्रक्रिया संदेश भेजता है, तो स्वीकार करते हैं , और आवश्यकतानुसार अन्य आदेशों को करने के लिए डिवाइस को बताएं

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

प्रेषण धागा अगले थ्रेड को पढ़ा धागा द्वारा परिभाषित करता है और इसे उसी COM पोर्ट पर WriteFile के माध्यम से भेजता है। कुंजी यह है कि मेरे और डिवाइस के बीच एक प्राप्त/प्रेषण संबंध है।

मेरा सवाल है, क्या मेरे यहां एक नेस्टेड निर्माता/उपभोक्ता मॉडल है? यदि मेरा प्राप्त थ्रेड डिवाइस से उपभोग कर रहा है और प्रेषण थ्रेड डिवाइस पर उत्पादन कर रहा है, तो धागे को स्वाभाविक रूप से बात करने की आवश्यकता है ताकि वे सिंक्रनाइज़ हो जाएं-सही? डिवाइस पर कुशलतापूर्वक और त्वरित रूप से बात करने के अपने प्रयासों को सिंक्रनाइज़ करने का सबसे अच्छा तरीका क्या है? नोट: मैं सी ++ बिल्डर 5 का उपयोग कर रहा हूं जिसमें टीटीएचड हैं और महत्वपूर्ण वर्गों और म्यूटेक्स का उपयोग कर सकते हैं।

संपादित करें: मैं भी मतदान का उपयोग कर रहा हूं इसलिए मैं प्रतीक्षाकॉमवेन्ट का उपयोग करने के लिए भी खुला हूं, अगर यह बेहतर काम करेगा!

उत्तर

1

आप कौन से संसाधन साझा कर रहे हैं जो आपको लगता है कि आपको सिंक्रनाइज़ करने की आवश्यकता है?

यदि आपके पास दो धागे के बीच एक कतार की तरह कुछ है तो यह एक सुंदर क्लासिक निर्माता/उपभोक्ता मॉडल है। E.G. यदि आपके पास सिर्फ एक थ्रेड पढ़ना है और फिर कतार में आदेश डालना है, जबकि एक और थ्रेड कतार से निकाला जाता है, तो कमांड को प्रोसेस करता है और डिवाइस पर लिखता है तो आपको क्यूई तक म्यूटेक्स या सेमफोर के साथ सिंक्रनाइज़ करने की आवश्यकता होती है।

शायद मुझे कुछ याद आ रहा है लेकिन यह केवल जटिल हो जाना चाहिए यदि आपके पास कतार से पढ़ने वाले कई धागे हैं और जिन आदेशों को प्रेषित करने की आवश्यकता है, क्रम में रहने की आवश्यकता है। तो इसे सरल रखने की कोशिश करें।

+0

ठीक है, लेकिन मैं डिवाइस तक पहुंच को सिंक्रनाइज़ कैसे करूं ताकि जब मैं पढ़ रहा हूं, तो मैं लिख नहीं रहा हूं? वैश्विक ध्वज? –

+0

क्या आप निश्चित हैं कि आपको ऐसा करना है? यदि ऐसा है तो आप पढ़ने/लिखने के कार्यों को सिंक करने के लिए एक सेमफोर का उपयोग कर सकते हैं। यह http://stackoverflow.com/questions/1488712/is-it-safe-to-read-and-write-to-a-serial-port-at-the-same-time-via- अलग-अलग हो सकता है उपयोगी। – Duck

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