2008-11-24 12 views
8

मैं stdin/निम्नलिखित विशेषताओं के साथ stdout के माध्यम से आईओ nonblocking लिए सबसे अच्छा समाधान खोजने की कोशिश कर रहा हूँ: जब तकक्रॉस-प्लेटफॉर्म (linux/Win32) nonblocking सी ++ आईओ पर stdin/stdout/stderr

  • पर्याप्त डेटा है, एन-आकार वाले हिस्सों में पढ़ें।
  • यदि पर्याप्त डेटा नहीं है, तो आंशिक खंड में पढ़ें।
  • यदि कोई डेटा उपलब्ध नहीं है, तो कुछ होने तक अवरुद्ध करें (भले ही यह एन से छोटा हो)।

लक्ष्य 'नियंत्रण' कोड को तुरंत संसाधित करते समय बड़े डेटासेट के लिए कुशल हस्तांतरण की अनुमति देना है (उन्हें कहीं कुछ आंशिक रूप से भरे बफर में रहने के बजाय)।

मुझे पता है कि मैं धागे और एक आईट्रीम :: get() लूप, या प्लेटफ़ॉर्म-विशिष्ट कोड का एक समूह लिखकर प्राप्त कर सकता हूं (क्योंकि आप विंडोज़ में फ़ाइल हैंडल पर() नहीं चुन सकते हैं) .. ((आईट्रीम :: रीडसम() भी है जो आशाजनक प्रतीत होता है, लेकिन Google पर केवल एक ही परिणाम जो लोग पा सकते हैं, वे वास्तव में अच्छी तरह से काम नहीं करते हैं।))

चूंकि मैंने बहुत कुछ नहीं किया है कोडिंग डब्ल्यू/इन एपीआई, शायद एक बेहतर तरीका है।

उत्तर

6

शायद boost::asio आपके लिए उपयोग किया जा सकता है?

+0

यह अपेक्षाकृत आशाजनक दिखता है (एक छोटी समस्या के लिए एक बड़ा हथौड़ा, लेकिन शायद सीखने लायक है) ... धन्यवाद! –

+0

हां, यह पोर्टेबल एसिंक्रोनस I/O के लिए शायद आपकी सबसे अच्छी शर्त है, क्योंकि भाषा में I/O * या * थ्रेड को अनब्लॉक करने के लिए मूल समर्थन नहीं है। आपको किसी प्रकार की लाइब्रेरी का उपयोग करना होगा, और बढ़ावा आमतौर पर एक अच्छी शर्त है। – jalf

+0

(यदि केवल Win32 ने केवल सॉकेट के बजाय मनमानी हैंडल पर चयन() या मतदान() का समर्थन किया है ... कुछ खुदाई करने के बाद, मैंने पुष्टि की है कि मैं जो कर सकता हूं वह कर सकता हूं और इसे स्थापित करने के लिए एक ट्यूटोरियल भी है अप: http://www.highscore.de/boost/process/process/tutorials.html#process.tutorials.async_io –

1

मैंने धागे और प्लेटफ़ॉर्म विशिष्ट कोड का उपयोग किया। my answer to another question देखें। मैं ओएस-विशिष्ट सामान इनपुट में उपलब्ध कराने में सक्षम था() (लिनक्स का चयन करता है, विंडोज़ सिर्फ सत्य लौटाता है)। मैं थ्रेड को पूरा करने की कोशिश करने के लिए Windows पर एक टाइमआउट के साथ WaitForSingleObject() का उपयोग कर सकता था, फिर इसे समाप्त करने के लिए TerminateThread()। बहुत बदसूरत, लेकिन टीम इस बिट बूस्ट का उपयोग नहीं करना चाहती थी।

0

मैंने jwhitlock के समान कुछ किया ... मैं एक StdinDataIO कक्षा के साथ समाप्त हुआ जो उपयुक्त ओएस-विशिष्ट कार्यान्वयन (*) के आसपास लपेटता है ताकि मेरा शेष प्रोग्राम फाइल डिस्क्रिप्टर StdinDataIO पर() का चयन कर सके, stdin के बारे में विंडोज़ की सीमाओं के आनंद से अनजान शेष। यदि आप चाहें तो here और here देखें, कोड सभी ओपन-सोर्स/बीएसडी-लाइसेंसीकृत है।

(*) कार्यान्वयन लिनक्स/मैकोज़क्स के लिए एक सरल पास-थ्रू है, और विंडोज़ में यह स्टडीन से पढ़ने के लिए एक बच्चे धागे को स्थापित करने की एक जटिल प्रक्रिया है और इसे वापस सॉकेट पर प्राप्त डेटा भेजता है मुख्य धागा ... बहुत सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है।

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