2012-06-05 13 views
49

की स्थिति प्राप्त करें क्या यह जांचना संभव है कि std::future समाप्त हो गया है या नहीं? जहां तक ​​मैं इसे करने का एकमात्र तरीका बता सकता हूं, शून्य अवधि के साथ wait_for पर कॉल करना होगा और जांच करें कि स्थिति ready है या नहीं, लेकिन क्या कोई बेहतर तरीका है?एक std :: भविष्य

+0

'वैध' के लिए जाँच करें? –

+6

@CatPlusPlus जब तक कि मैं गलत नहीं हूं, 'वैध' केवल तभी जांचता है जब भविष्य में एक साझा स्थिति हो (यानी यह 'सत्य' वापस आती है जब तक कि भविष्य में 'get' कहा जाता है)। –

+0

तो, यदि 'get' को कॉल किया गया है और संग्रहीत मूल्य लौटाता है, तो क्या आप अभी भी 'सत्य' चाहते हैं? (मुझे यकीन नहीं है कि यह उपयोगी क्यों होगा, क्योंकि आप केवल एक बार मूल्य प्राप्त कर सकते हैं।) –

उत्तर

36

आप सही हैं, और अतीत में एक समय के साथ wait_until पर कॉल करने के अलावा (कोई समकक्ष नहीं है) कोई बेहतर तरीका नहीं है।

तुम हमेशा एक छोटे से आवरण लिख सकता है अगर आप एक और अधिक सुविधाजनक वाक्य रचना चाहते हैं:

template<typename R> 
    bool is_ready(std::future<R> const& f) 
    { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; } 

N.B. यदि फ़ंक्शन को स्थगित कर दिया गया है तो यह कभी भी सही नहीं होगा, इसलिए शायद wait_for को उस मामले में जांचना बेहतर होगा जहां आप एक निश्चित समय बीतने के बाद या सिस्टम लोड कम होने के बाद स्थगित रूप से स्थगित कार्य को चलाने के लिए चाहते हैं।

+1

wait_for भविष्य को म्यूटेट नहीं करता है इसलिए पैरामीटर को कॉन्स्ट के रूप में घोषित किया जा सकता है। –

+1

अगर पहले से ही कॉल किया गया था या भविष्य को कभी शुरू नहीं किया गया था तो रन टाइम त्रुटियों से बचने के लिए पहले वैध() को जांचने पर विचार करें। –

+2

क्या प्रतीक्षा_for (chrono :: सेकंड (0)) तुरंत लौटने की गारंटी है या कुछ कार्यान्वयन पर कुछ मिलीसेकंड के लिए धागे का नियंत्रण प्राप्त कर सकता है? यह जानना बहुत महत्वपूर्ण होगा क्योंकि कुछ मिलीसेकंड एक गेम को कोड करते समय बहुत समय है ... – kynnysmatto

6

मेरी पहली शर्त के साथ एक 0 अवधि wait_for कहते हैं, और परिणाम कोड कि future_status::ready में से एक, future_status::deferred या future_status::timeout हो सकता है की जांच करने के लिए होगा।

cppreference में वे कहते हैं कि valid()चेकों का दावा करता है, तो परिणाम उपलब्ध है, लेकिन मानक का कहना है कि valid()true वापस आ जाएगी अगर *this एक साझा राज्य को संदर्भित करता है कि क्या है कि राज्य तैयार है या नहीं की स्वतंत्र रूप से,।

+4

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

7

std :: भविष्य के लिए is_ready सदस्य फ़ंक्शन in the works है। इस बीच, वीसी कार्यान्वयन में _Is_ready() सदस्य है।

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