2011-02-19 13 views
9

उदाहरण के लिए क्यूटी में यदि आप किसी थ्रेड में सिग्नल उत्सर्जित करते हैं, तो जीयूआई थ्रेड, सिग्नल को जीयूआई थ्रेड में बाद में निष्पादित किया जाता है और इसे निष्पादित किया जाता है, तो क्या इसे बढ़ावा देने के लिए कोई तरीका है?बूस्ट में एक थ्रेड में सिग्नल भेजते हैं और संबंधित स्लॉट को किसी अन्य थ्रेड में निष्पादित किया जाता है?

धन्यवाद

उत्तर

15

किसी ईवेंट लूप के लिए boost :: asio :: io_service का उपयोग करें। आप इस ऑब्जेक्ट के अंदर कार्यों को पोस्ट कर सकते हैं और थ्रेड सुरक्षित तरीके से उन्हें एक और थ्रेड निष्पादित कर सकते हैं:

struct MyClass 
{ 
    boost::io_service service; 
    void doSomethingOp() const { ... } 

    void doSomething() 
    { 
     service.post(boost::bind(&MyClass::doSomethingOp, this)); 
    } 

    void loop() 
    { 
      service.run(); // processes the tasks 
    } 
}; 

boost::signal<void()> mySignal; 

MyClass myClass; 
mySignal.connect(boost::bind(&MyClass::doSomething, boost::ref(myClass))); 

// launches a thread and executes myClass.loop() there 
boost::thread t(boost::bind(&MyClass::loop(), boost::ref(myClass))); 

// calls myClass.doSomething() in this thread, but loop() executes it in the other 
mySignal(); 
+2

THX इस बहुत उपयोगी नमूने के लिए! चूंकि बढ़ावा :: सिग्नल को बहिष्कृत किया गया है, मुझे boost :: signals2 :: सिग्नल <> का उपयोग करना होगा। – synapse

2

सीधे नहीं, क्योंकि बूस्ट एक ईवेंट लूप प्रदान नहीं करता है।

किसी अन्य धागे में एक सिग्नल संभालने के लिए, कि एक और थ्रेड को हैंडलर की कतार की जांच करने की आवश्यकता है, इसे चलाने और उन्हें निष्पादित करना चाहिए (जो आमतौर पर किसी प्रकार का इवेंट-लूप होता है)। बूस्ट एक प्रदान नहीं करता है, इसलिए आपको इसे कहीं और से प्राप्त करने की आवश्यकता होगी या इसे लिखना होगा।

यदि आपके पास कोई ईवेंट-लूप है, जो सिग्नल प्रदान नहीं करता है, (या कतारों के साथ कुछ सरल समाधान लागू करता है) तो आप boost.signals2 (boost.signals नहीं) का उपयोग करने में सक्षम होना चाहिए, क्योंकि वह संस्करण नहीं है थ्रेड-सुरक्षित) operator+= ओवरराइड करके कुछ हैंडलर को कुछ में लपेटने के लिए, जो इसे अन्य थ्रेड में निष्पादन के लिए कतारबद्ध करेगा। आप इसे रिटर्न वैल्यू के साथ सिग्नल के लिए भी कार्यान्वित करने में सक्षम हो सकते हैं (जो क्यूटी द्वारा समर्थित नहीं है, लेकिन बूस्ट द्वारा समर्थित है), लेकिन आपको मृत-लॉक से बचने के लिए सावधान रहना होगा।

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