2011-04-08 13 views
5

खिड़कियों सी ++ में मैं इस घटना के लिएबूस्ट समतुल्य

हैंडल एच = CreateEvent (...)

मैं तो सेट कर सकते हैं एक हैंडल बना सकते हैं और है कि घटना रीसेट

SetEvent (कर सकते हैं। ..) और ResetEvent (...)

अंत में, मैं OpenEvents आदेश OpenEvent (...)

वहाँ की घटनाओं के लिए एक बढ़ावा बराबर है का उपयोग कर सकते हैं?

+0

क्या आपको 'ओपनएवेंट' के बहु-प्रक्रिया आईपीसी पहलू की आवश्यकता है, या क्या आपको केवल भीतर प्रक्रिया संचार की आवश्यकता है? – Thanatos

+0

केवल प्रक्रिया के भीतर, कोई आईपीसी नहीं। – rossb83

+0

भले ही सख्ती से डुप्लिकेट न हो, यह http://stackoverflow.com/questions/1677070/cross-platform-equivalent-to- विन्डोज़-events प्रश्न आपके प्रश्न का उचित उत्तर प्रदान करता है। – Cray

उत्तर

6

मुझे लगता है कि आपको घटनाओं की नकल करने के लिए boost::mutex, boost::unique_lock, boost::condition_variable और संभवतः bool का उपयोग करने की आवश्यकता है।

किसी ईवेंट की प्रतीक्षा करने के लिए आपको वास्तव में WaitForSingleObject की आवश्यकता हो सकती है। इस तरह हो सकता है:

void wait_for_user_input() 
{ 
    boost::unique_lock<boost::mutex> lock(mut); 
    while(!data_ready) 
    { 
     cond.wait(lock); 
    } 
    process_user_input(); // it might be not necessary to hold mutex locked here!!! 
          // if so just add curly braces like this: 
          // void wait_for_user_input() 
          // { 
          // { 
          //  boost::unique_lock<boost::mutex> lock(mut); 
          //  while(!data_ready) { cond.wait(lock); } 
          // } 
          // process_user_input(); 
          // } 



} 
-1

एक बढ़ावा lock (म्यूटेक्स) एक ही चीज़ करेगा। आप उन पर इंतजार कर सकते हैं।

+0

जरूरी नहीं है। थ्रेड बी एक घटना को ट्रिगर करने तक मैं लगातार थ्रेड ए में थोड़ी देर लूप करना चाहता हूं। – rossb83

+0

तो अपने लूप –

+0

के अंदर "timed_lock (mutex, timeout)" का उपयोग करें, मैं नहीं चाहता कि कोई भी समय खेल रहा हो। मैं बस एक घटना ट्रिगर चाहता हूँ। जब उपयोगकर्ता किसी ऐसे बटन पर क्लिक करता है जो किसी ईवेंट का कारण बनता है। – rossb83

-1

तुम क्या चाहते boost interprocess library से named_condition variable है। विंडोज़ घटनाओं से मुख्य अंतर यह है कि आपको उन्हें named_mutex के संयोजन के साथ उपयोग करना होगा।

नोट, आप इन प्रक्रियाओं के भीतर इन बूस्ट इंटरप्रोसेस प्राइमेटिव का उपयोग कर सकते हैं। मुझे लगता है कि आपको इनकी आवश्यकता है क्योंकि आप OpenEvent का उपयोग कर रहे हैं (जो किसी नाम के उपयोग से ऑब्जेक्ट को साझा करने का तात्पर्य है)। यदि आप किसी नाम का उपयोग करने से बच सकते हैं, तो आप boost thread लाइब्रेरी से गैर-नामित रूपों का उपयोग कर सकते हैं।

+3

लेखक के अनुसार आईपीसी की आवश्यकता नहीं है। यदि एप्लिकेशन क्रैश स्वचालित रूप से हटाए जाते हैं तो 'नाम म्यूटेक्स' के अलावा। और इसके परिणामस्वरूप एक को म्यूटेक्स नाम दिया जाता है जिसके परिणामस्वरूप उसे किसी भी तरह से इस साइट को संभालना पड़ता है। आईएमएचओ यह सिर्फ असीमित जटिलता पैदा करता है। –

4

थ्रेडसेफ Boost Signals2 लाइब्रेरी आपके लिए उपयोग की जा सकती है। मूल सिग्नल लाइब्रेरी थ्रेड-सुरक्षित नहीं थी, लेकिन सिग्नल/स्लॉट फ्रेमवर्क लागू किया गया जो घटनाओं के विचारों से बहुत अधिक मील दूर नहीं है। चूंकि सिग्नल 2 थ्रेडसेफ है, इसलिए आप थ्रेड के बीच घटनाओं को पारित करने के लिए इसका उपयोग करने में सक्षम होना चाहिए।

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