2010-12-16 3 views
9

मैं अपने सी ++ प्रोजेक्ट में थ्रेड का समर्थन करने के लिए boost :: थ्रेड लाइब्रेरी (V1.44) का उपयोग कर रहा हूं।असीमित समय के लिए बूस्ट :: थ्रेड को रोकना

उपयोगकर्ता को टेस्ट लूप के निष्पादन को रोकने में सक्षम होना चाहिए, जो कि की असीमित मात्रा के लिए अपने स्वयं के धागे में चल रहा है और जब भी वह प्रसन्न होता है तो उसे फिर से शुरू करने में सक्षम होना चाहिए।

विंडोज के तहत मैं इस

bool ContintueLoop(){ 
if(testLoopPaused){ //testLoopPaused can be set by the user via GUI elements 
    try{ 
     boost::this_thread::interruptible_wait(2147483648); //that's very ugly, 
     // somebody knows the right way to pause it for a unlimited time? 
     return true; 
    } 
    catch(boost::thread_interrupted& e){ //when the user selects resume the 
     // the thread is interrupted and continues from here 
     testLoopPaused = false; 
     return true; 
    } 
if(...) //test for other flags like endTestLoop etc. 
    .... 
} 

बिना किसी समस्या के इस काम करता है जैसे कि यह हल है, भले ही यह एक असीमित रुकावट के लिए सही मान पता करने के लिए अच्छा होगा।

मैं अपने कार्यक्रम के एक लिनक्स संस्करण लागू करने के लिए शुरू कर दिया है, लेकिन मैं इस समस्या कि मैं संकलक त्रुटि

error: interruptible_wait is not a member of boost::this_thread

प्रश्न पाने में भाग: क्या एक बढ़ावा रोकने के लिए एक अच्छा तरीका है :: धागा असीमित समय के लिए (जब तक उपयोगकर्ता इसे फिर से शुरू करने का फैसला करता)

आपको बहुत बहुत

+0

क्या कोई टिप्पणी नहीं है जैसे 'Suspend() '? –

+0

@sad_man, नहीं है। एक नींद समारोह है जो निर्धारित समय के लिए थ्रेड को निलंबित कर देगा, लेकिन मुझे नहीं लगता कि निलंबित धागा को यादृच्छिक समय – zitroneneis

उत्तर

18

मैं किसी भी तरह बढ़ावा :: धागा का उपयोग कर एक मनमाना बिंदु पर एक धागा रोकने के लिए के बारे में पता नहीं कर रहा हूँ धन्यवाद, हालांकि, आपके द्वारा वर्णित अभिवादन को बूलियन, म्यूटेक्स और कंडीशन वैरिएबल का उपयोग करके कार्यान्वित किया जा सकता है।

bool m_pause; // initialise to false in constructor! 
boost::mutex m_pause_mutex; 
boost::condition_variable m_pause_changed; 

void block_while_paused() 
{ 
    boost::unique_lock<boost::mutex> lock(m_pause_mutex); 
    while(m_pause) 
    { 
     m_pause_changed.wait(lock); 
    } 
} 

void set_paused(bool new_value) 
{ 
    { 
     boost::unique_lock<boost::mutex> lock(m_pause_mutex); 
     m_pause = new_value; 
    } 

    m_pause_changed.notify_all(); 
} 

तो, अपने कार्यकर्ता सूत्र में आप समय-समय block_while_paused() कॉल कर सकते हैं जो वापस नहीं होगा, जब तक m_pause गलत पर सेट है। आपके मुख्य थ्रेड में आप set_paused(value) को पॉज़ चर के मान को थ्रेड सुरक्षित तरीके से अपडेट करने के लिए कॉल करते हैं।

अस्वीकरण: यह कुछ इसी तरह कोड हम यहाँ है से अनुकूलित है, लेकिन इस बात की पुष्टि यह वास्तव में काम करता है :), अनुकूलित कोड को संकलित करने के अकेले प्रयास नहीं किया है

+0

@ एडम पर फिर से शुरू किया जा सकता है, जो बहुत ही आशाजनक दिखता है। मैं इसे लागू करने और वापस रिपोर्ट करने की कोशिश करूंगा, धन्यवाद! – zitroneneis

+0

यदि आपके पास कुछ प्रकार की कक्षा है जो आपके कार्यकर्ता धागे का प्रतिनिधित्व करती है तो सबसे अच्छी बात यह है कि कक्षा में जो कुछ भी हो, उसे सबकुछ बनाकर 'set_paused' निजी करें ताकि इसका दुरुपयोग नहीं किया जा सके। ध्यान देने योग्य एकमात्र चीज यह है कि 'म्यूटेक्स' और' condition_variable' की प्रतिलिपि नहीं बनाई जा सकती है, जो कि (आप बूस्ट के साथ अपना धागा कैसे बना रहे हैं इसके आधार पर) थोड़ी सी असुविधा हो सकती है। –

+0

अब सिर्फ एक कतार डालें और आप पूरी तरह से थ्रेड को नियंत्रित कर सकते हैं;) @ एडम: छोटी टिप्पणी, आपको notify_all() को अनलॉक करने की आवश्यकता नहीं है, जो आपके कोड को थोड़ा सा सरल बना देगा। – stefaanv

1

किसी को अभी भी उल्लेख कार्यक्षमता (सो धागा की जरूरत है जब तक कोई घटना न हो) और बूस्ट लाइब्रेरीज़ का उपयोग करके आरामदायक है तो बूस्ट। इंटरप्रोसेस लाइब्रेरी सेमफोर तंत्र प्रदान करता है जिसका उपयोग प्रश्न में वर्णित किया जा सकता है।

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

  • कोई संबंधित समस्या नहीं^_^