2013-06-24 6 views
5

क्या किसी के पास उदाहरणों के लिए एक अच्छा सूचक है जो futures from the Boost thread libraryBoost ASIO के साथ उपयोग करता है? मेरे पास एक मौजूदा एसिंक्रोनस लाइब्रेरी है जो कॉलबैक फ़ंक्शन का उपयोग करती है जिसे मैं एक मित्रवत सिंक्रोनस इंटरफ़ेस प्रदान करना चाहता हूं।बूस्ट के साथ वायदा का उपयोग :: asio

उत्तर

7

मौजूदा एसिंक्रोनस लाइब्रेरी के साथ बातचीत को समझे बिना संक्षिप्त समाधान प्रदान करना मुश्किल है। फिर भी, यह answer सक्रिय ऑब्जेक्ट पैटर्न को लागू करने के लिए Boost.Future और Boost.Asio का उपयोग करता है। जब creating a future, यह निर्धारित करने के दृष्टिकोण और अधिक उपयुक्त है मौजूदा अतुल्यकालिक पुस्तकालय की जांच पर विचार करें:

  • boost::packaged_task एक functor है कि एक future बना सकते हैं प्रदान करता है। इस मज़ेदार को Boost.Asio io_service के संदर्भ में निष्पादित किया जा सकता है। मौजूदा एसिंक्रोनस लाइब्रेरी के साथ-साथ रैवल्यू सेमेन्टिक्स के आसपास काम करने के लिए कुछ अतिरिक्त स्तर की रैपिंग की आवश्यकता हो सकती है। इस फ़ंक्शन का उपयोग करने पर विचार करें यदि वर्तमान फ़ंक्शन कॉल पहले से ही मान वापस कर देता है।
  • boost::promise एक निम्न स्तर की वस्तु प्रदान करता है जिसका मूल्य निर्धारित हो सकता है। इसे मौजूदा कार्यों को संशोधित करने की आवश्यकता हो सकती है, promise को तर्क के रूप में स्वीकार करने की आवश्यकता है, और इसे फ़ंक्शन के भीतर पॉप्युलेट करें। promise Boost.Asio io_service को प्रदान किए गए हैंडलर से बाध्य होगा। के साथ, इसे रावल्यू सेमेन्टिक्स से निपटने के लिए रैपिंग के अतिरिक्त स्तर की आवश्यकता हो सकती है।

अंत में, Boost.Asio 1.54 (बीटा में), C++ futures के लिए प्रथम श्रेणी के सहायता प्रदान करता है। आधिकारिक example यहां है। यहां तक ​​कि यदि आप वर्तमान में 1.54 बीटा का उपयोग करने में असमर्थ हैं, तो यह इंटरफ़ेस और कार्यान्वयन की जांच करने के लिए फायदेमंद हो सकता है।

4

आप इस उदाहरण को देखो कृपया:

http://www.boost.org/doc/libs/1_61_0/doc/html/boost_asio/example/cpp11/futures/daytime_client.cpp

इससे पता चलता है बढ़ावा asio साथ std::future का उपयोग कैसे करें।

#include <boost/asio/use_future.hpp> 

तो फिर तुम उस तरह कोड लिख सकते हैं::

std::future<std::size_t> my_future = 
    my_socket.async_read_some(my_buffer, boost::asio::use_future); 

आप boost::future उपयोग करने के लिए तो मैं एक और संस्करण लागू करने के लिए सुझाव देंगे की जरूरत है

प्रमुख मुद्दा फ़ाइल use_future.hpp शामिल करने के लिए है , boost::asio::use_future के समान।
फ़ाइल use_future.hpp उस के लिए एक अच्छा उदाहरण है।

+0

यह कभी काम नहीं करता है, यह हमेशा के लिए – madduci

+1

को अवरुद्ध करने का कारण बनता है, इस तरह के समाधान सक्रिय रूप से मेरे प्रोजेक्ट पर उपयोग किया जाता है। और यह काम करता है। क्या आप वाकई अपने मामले में एएसओ को अवरुद्ध करने का कारण जानते हैं? –

+0

जाहिर है कि उदाहरण में कोड प्रत्येक भविष्य पर ब्लॉक करता है। अगर आप सिर्फ प्रत्येक पर ब्लॉक करते हैं तो वायदा का उपयोग करने का क्या मतलब है? साथ ही साथ पहले स्थान पर अवरुद्ध कोड का उपयोग कर सकते हैं ... – kralyk

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