मैं सी ++ में libcurl का उपयोग कर रहा हूं, और मैं Boost.Thread का उपयोग कर अपने यूआई से अलग थ्रेड में curl_easy_perform
पर कॉल कर रहा हूं।मैं तुरंत कर्ल ऑपरेशन कैसे रद्द कर सकता हूं?
मुख्य यूआई में एक रद्द बटन है जो मैं पूरी तरह उत्तरदायी होना चाहता हूं (यानी, जब कोई उपयोगकर्ता उस पर क्लिक करता है, तो उसे तुरंत प्रतिक्रिया देनी चाहिए)। मैंने पढ़ा है, लिखते हैं, और एक परमाणु should_cancel
चर को पढ़ने के लिए की स्थापना की कॉलबैक (this प्रश्न के रूप में) के लिए प्रगति, लेकिन वहाँ दो समस्याएं हैं:
अक्सर जब रद्द से एक बहुत छोटे (लेकिन ध्यान देने योग्य) देरी नहीं है कर्ल ऑपरेशन पूरा होने पर दबाया जाता है।
कभी-कभी, बहुत लंबा (कभी-कभी अंतराल) देरी होती है। इस मामले में, या तो:
ए। कॉलबैक की प्रगति, पढ़ना और लिखना लंबे समय तक नहीं कहा जाता है, या
बी। प्रगति कॉलबैक कहा जाता है, मैं एक nonzero मान (जिसका अर्थ है इसे समाप्त करना चाहिए) लौटाता है, लेकिन कर्ल ऑपरेशन थोड़ी देर के लिए पूरा नहीं होता है (वास्तव में, प्रगति समारोह इस दौरान फिर से कहा जाता है!)
तो:
- क्यों बहुत ज़्यादा समय लग (विशेष रूप से प्रगति फ़ंक्शन कॉल के बिना) होता है?
- रद्द करने के बटन को ठीक तरह से प्रतिक्रिया देने के लिए मुझे क्या करना चाहिए?
एक संभावना यूआई को बताना है कि रद्द करने का ऑपरेशन सफल हुआ, लेकिन जब तक यह रद्द नहीं हो जाता तब तक पृष्ठभूमि में कर्ल थ्रेड चलाते रहें। इसके साथ समस्या (मुझे लगता है) यह है कि यह should_cancel
वैरिएबल को ग्लोबल होने के लिए मजबूर करता है, ऑपरेशन शुरू होने पर डायलॉग बॉक्स पर जाने के बजाए।
कैसे गैर अवरुद्ध curl_multi_perform उपयोग के बारे में http: –