मुझे पता चला है कि boost :: सिग्नल 2 कनेक्टेड स्लॉट्स के आलसी विलोपन के प्रकार का उपयोग करता है, जिससे कनेक्शन का उपयोग करना मुश्किल होता है जो वस्तुओं के जीवनकाल का प्रबंधन करता है। मैं डिस्कनेक्ट होने पर सीधे स्लॉट को हटाने के लिए मजबूर करने का एक तरीका ढूंढ रहा हूं। मेरे कोड को अलग-अलग डिजाइन करके समस्या के आसपास काम करने के बारे में कोई भी विचार भी सराहना की जाती है!बूस्ट में स्लॉट को हटाने का बल :: सिग्नल 2
यह मेरा परिदृश्य है:
class ActualWorker {
public:
boost::signals2<void()> OnWorkComplete;
};
class Command : boost::enable_shared_from_this<Command> {
public:
...
void Execute() {
m_WorkerConnection = m_MyWorker.OnWorkDone.connect(boost::bind(&Command::Handle_OnWorkComplete, shared_from_this());
// launch asynchronous work here and return
}
boost::signals2<void()> OnComplete;
private:
void Handle_OnWorkComplete() {
// get a shared_ptr to ourselves to make sure that we live through
// this function but don't keep ourselves alive if an exception occurs.
shared_ptr<Command> me = shared_from_this();
// Disconnect from the signal, ideally deleting the slot object
m_WorkerConnection.disconnect();
OnComplete();
// the shared_ptr now goes out of scope, ideally deleting this
}
ActualWorker m_MyWorker;
boost::signals2::connection m_WorkerConnection;
};
वर्ग इस तरह के बारे में शुरू हो जाती है:: मैं एक कमान वर्ग कुछ है कि समय एसिंक्रोनस रूप लेता है, कुछ इस तरह (सरलीकृत) देख कर के लिए जिम्मेदार है
...
boost::shared_ptr<Command> cmd(new Command);
cmd->OnComplete.connect(foo);
cmd->Execute();
// now go do something else, forget all about the cmd variable etcetera.
कमांड क्लास खुद को एक साझा_ptr प्राप्त करके खुद को जीवित रखती है जो बूस्ट :: बाइंड का उपयोग करके वास्तविक वर्कर सिग्नल से जुड़ी है।
जब कार्यकर्ता पूरा करता है, कमांडर में हैंडलर का आह्वान किया जाता है। अब, चूंकि मैं कमांड ऑब्जेक्ट को नष्ट करना चाहता हूं, इसलिए मैं सिग्नल से डिस्कनेक्ट करता हूं जैसा ऊपर दिए गए कोड में देखा जा सकता है। समस्या यह है कि डिस्कनेक्ट होने पर वास्तविक स्लॉट ऑब्जेक्ट को हटाया नहीं जाता है, इसे केवल अमान्य के रूप में चिह्नित किया जाता है और फिर बाद में हटा दिया जाता है। यह बदले में सिग्नल पर फिर से आग लगने लगता है, जो मेरे मामले में नहीं करता है, जिससे स्लॉट कभी समाप्त नहीं होता है। बूस्ट :: बाइंड ऑब्जेक्ट इस प्रकार कभी भी गुंजाइश से बाहर नहीं जाता है, मेरे ऑब्जेक्ट में एक साझा_प्टर धारण करता है जो कभी भी हटा नहीं जाएगा।
मैं इस साझाकर्ता के बजाय इस पॉइंटर का उपयोग करके बाध्यकारी करके और उसके ऑब्जेक्ट को साझा_ptr का उपयोग करके जीवित रखकर काम कर सकता हूं जिसे मैं हैंडलर फ़ंक्शन में रिलीज़ करता हूं, लेकिन यह डिजाइन को थोड़ा अधिक जटिल बनाता है। डिस्कनेक्ट होने पर स्लॉट को हटाने के लिए सिग्नल 2 को मजबूर करने का कोई तरीका है? या डिजाइन को सरल बनाने के लिए मैं कुछ और कर सकता हूं?
कोई टिप्पणी की सराहना की जाती है!
निष्पादित समारोह के अंत में डिस्कनेक्ट कर रहा है के लिए मेरे पैच है सब पर जोड़ने का उद्देश्य धरा - यानी मैं एक कॉलबैक नहीं मिलेगा जब अतुल्यकालिक काम पूरा हो गया है तो आपका सुझाव वास्तव में व्यवहार्य नहीं है। – villintehaspam