2013-08-22 8 views
6

मैं एक कमांड लाइन सर्वर प्रोग्राम करने की कोशिश कर रहा हूं जो एक सीरियल पोर्ट से जानकारी प्राप्त करेगा, इसे पार्स करेगा, और इसे किसी आंतरिक ऑब्जेक्ट में रिकॉर्ड करेगा।सी ++ std :: सदस्य फ़ंक्शन का थ्रेड

फिर क्लाइंट से अनुरोध पर सर्वर अनुरोधित जानकारी वापस कर देगा।

मैं क्या करना चाहता हूं, रिसेवर & एक अलग थ्रेड में पार्सर भागों को रखने के लिए सर्वर को डेटा संग्रह के साथ हस्तक्षेप न करने के लिए रखा गया है।

#include <iostream> 
#include <thread> 

class exampleClass{ 
    std::thread *processThread; 

    public void completeProcess(){ 
     while(1){ 
      processStep1(); 
      if (verification()){processStep2()} 
     } 
    }; 

    void processStep1(){...}; 
    void processStep2(){...}; 
    bool verification(){...}; 
    void runThreaded(); 
} // End example class definition 

// The idea being that this thread runs independently 
// until I call the object's destructor 

exampleClass::runThreaded(){ 
    std::thread processThread(&exampleClass::completeProcess, this); 
} // Unfortunately The program ends up crashing here with CIGARET 
+0

क्या सार्वजनिक शून्य पूर्ण प्रसंस्करण() {..' संकलित किया जा सकता है? – Deqing

+0

[संभावित कार्य के साथ प्रारंभ धागा] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/10673585/start-thread-with-member- कार्यक्षमता) –

उत्तर

8

आप एक सदस्य समारोह के अंदर एक स्थानीय धागा चल रहे हैं। आप इसे में शामिल होने या अलग कर दिया है और, क्योंकि यह स्थानीय है, तो आप समारोह अपने आप में यह करने के लिए है: एक शुरू करने के बजाय

exampleClass::runThreaded() 
{ 
    std::thread processThread(&exampleClass::completeProcess, this); 
    // more stuff 
    processThread.join(); 
} // 

मैं अनुमान लगा रहा हूँ कि तुम क्या वास्तव में चाहते हैं एक डेटा सदस्य धागा शुरू करने के लिए है स्थानीय एक यदि आप ऐसा करते हैं, तो आपको अभी भी इसमें शामिल होना होगा, उदाहरण के लिए विनाशक में। इस मामले में, अपने विधि

exampleClass::runThreaded() 
{ 
    processThread = std::thread(&exampleClass::completeProcess, this); 
} 

और नाशक

exampleClass::~exampleClass() 
{ 
    processThread.join(); 
} 

और processThread एक std::thread, नहीं एक के लिए एक सूचक होना चाहिए होना चाहिए।

डिज़ाइन पर बस एक नोट: यदि आपके पास थ्रेड डेटा सदस्य पर कार्य करने वाली runThreaded विधि है, तो आपको धागे में शामिल होने से पहले इसे एक से अधिक बार कॉल करने के बारे में बहुत सावधान रहना होगा। यह कन्स्ट्रक्टर में थ्रेड लॉन्च करने और विनाशक में शामिल होने के लिए और अधिक समझ सकता है।

+0

वह (दूसरा विचार) यह था, धन्यवाद! – Torrijos

3

थ्रेड ऑब्जेक्ट स्टैक पर है और इसे फ़ंक्शन एंड पर नष्ट किया जा रहा है। थ्रेड ऑब्जेक्ट विनाशक std::terminate पर कॉल करता है यदि थ्रेड अभी भी चल रहा है, जैसा कि आपके मामले में है। here देखें।

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