2009-12-14 12 views
15

हाल ही में समाप्त कर सकते हैं, मैं इस समस्या का सामना करना रूप में मैं इस शीर्षक में memtioned। मैंने QThread :: terminate() का उपयोग करके कोशिश की है, लेकिन मैं थ्रेड को रोक नहीं सकता, जो कि मृत लूप में है (मान लें, जबकि (1))।कैसे मैं एक QThread

बहुत बहुत धन्यवाद।

+0

Retagged। – ChrisV

+2

क्यूटी दस्तावेज़ कहता है: "चेतावनी: यह कार्य खतरनाक है और इसका उपयोग निराश है। थ्रेड को कोड कोड में किसी भी बिंदु पर समाप्त किया जा सकता है। डेटा को संशोधित करते समय थ्रेड को समाप्त किया जा सकता है। धागे को साफ़ करने का कोई मौका नहीं है स्वयं, किसी भी म्यूटेक्स को अनलॉक करें, आदि। संक्षेप में, इस फ़ंक्शन का उपयोग केवल तभी करें जब पूरी तरह जरूरी हो। QThread :: setTerminationEnabled() को कॉल करके टर्मिनेशन को स्पष्ट रूप से सक्षम या अक्षम किया जा सकता है। समाप्ति को समाप्त होने पर इस फ़ंक्शन को कॉल करने से परिणाम समाप्त हो जाते हैं, जब तक समाप्ति फिर से सक्षम नहीं हो जाती है। " –

उत्तर

0

क्या आपने exit या quit को आजमाया है?

+0

क्यूटी सहायता दस्तावेज़ से उद्धरण: "यह फ़ंक्शन कुछ भी नहीं करता है अगर थ्रेड में इवेंट लूप नहीं है" यह इवेंट लूप के मामले में काम कर सकता है। लेकिन यदि मैं धागा को अपना काम पूरा करने से पहले इसे समाप्त करना चाहता हूं, तो मुझे कैसे करना चाहिए? बहुत बहुत धन्यवाद। मेरे प्रिय। – user230938

+0

वास्तव में उन 2 फ़ंक्शंस वास्तव में निष्पादित होने पर ईवेंट लूप से वापस आने के लिए उपयोग किए जाते हैं। –

0

क्या थ्रेड कॉल QThread::setTerminationEnabled(false) था? इससे थ्रेड समाप्ति अनिश्चित काल तक देरी होगी।

संपादित करें: मुझे नहीं पता कि आप किस प्लेटफ़ॉर्म पर हैं, लेकिन मैंने QThread :: समाप्त करने के विंडोज कार्यान्वयन की जांच की है। मान लिया जाये कि धागा वास्तव में के साथ शुरू हो चल रहा था, और समाप्ति ऊपर समारोह के माध्यम से निष्क्रिय नहीं किया गया था, यह मूल रूप से Windows API में TerminateThread() के चारों ओर एक आवरण है। यह समारोह नहीं धागे से अनादर को स्वीकार करता है, और संसाधन लीक और इसी तरह झूलने राज्य के साथ पीछे एक गड़बड़ छोड़ जाता है। यदि यह धागा की हत्या नहीं कर रहा है, आप या तो ज़ोंबी गिरी कॉल के साथ काम कर रहे हैं (सबसे अधिक संभावना अवरुद्ध आई/ओ) या यहां तक ​​कि बड़ी समस्याओं कहीं है।

+0

नहीं, और मुझे यकीन है कि थ्रेड समाप्त किया जा सकता है। धन्यवाद। – user230938

+0

और मैं इसे सेटटार्मिनेशन सक्षम (सत्य) कहते हैं; – user230938

12

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

अपने समय (1) को (isAlive()) में बदलने की कोशिश करें और जब आप थ्रेड को बाहर निकलना चाहते हैं तो आलिव() वापस झूठ बोलें।

+0

हाय, आरपीजी। जबकि (1) का उदाहरण सिर्फ एक मामला है। जो मैं वास्तव में चाहता हूं वह थ्रेड को समाप्त करना है जो भारी गणना कर रहा है जो बहुत लंबे समय तक टिकेगा। मैं इसे उत्तेजना खत्म करने से पहले इसे रोकना चाहता हूं। धन्यवाद। ps: मैंने एक सुराग देखा कि रॉकनोल एक Qthread को रोकने के लिए - पाइप पाइप देता है। लेकिन मुझे समाधान कभी नहीं मिला। – user230938

+0

अपने भारी गणना समारोह में बाधाओं के समान कुछ जोड़ने का प्रयास करें: http://www.justsoftwaresolutions.co.uk/threading/thread-interruption-in-boost-thread-library.html – rpg

+0

हां, मैं जो कहा जाता है उससे सहमत हूं यहाँ। कठिन तरीके से धागे को समाप्त करना कभी अच्छी बात नहीं है। –

0

अनाम पाइप

int gPipeFdTest[2]; //create a global integer array 

एक के रूप में उपयोग करने के लिए जब तुम कहाँ बनाने के लिए पाइप का उपयोग

if(pipe(gPipeFdTest) < 0) 

{ 

perror("Pipe failed"); 

exit(1); 

} 

ऊपर कोड एक पाइप जो दो है पैदा करेगा इरादा समाप्त होता है gPipeFdTest [0] पढ़ने के लिए और लिखने के लिए gPipeFdTest [1]। चुनिंदा सिस्टम कॉल का उपयोग करके पाइप को पढ़ने के लिए आपके रन फ़ंक्शन में आप क्या कर सकते हैं। और जहां से आप भागने से बाहर निकलना चाहते हैं, वहां लेखन प्रणाली कॉल का उपयोग करके लिखने के लिए तैयार किया गया है। मैंने पाइप के पढ़ने के अंत की निगरानी के लिए चुनिंदा सिस्टम कॉल का उपयोग किया है क्योंकि यह मेरे प्रत्यारोपण के अनुरूप है। अपने मामले में यह सब समझने की कोशिश करें। अगर आपको और मदद की ज़रूरत है, तो मुझे एक चर्चा दें।

संपादित करें:

मेरे समस्या आपके जैसे किया गया था। मैं थोड़ी देर के (1) पाश था और अन्य बातों के मैं जरूरत mutexes और अन्य फैंसी बहु सूत्रण जम्बो की कोशिश की है, जो जटिलता जोड़ा और डिबगिंग बुरा सपना था। पाइपों का उपयोग करके मुझे उन जटिलताओं से कोड मिला जो कोड को सरल बनाते थे। मैं यह नहीं कह रहा हूँ कि यह सबसे अच्छा विकल्प है, लेकिन मेरे मामले में यह पता चला सबसे अच्छा और साफ विकल्प हो सकता है। इस समाधान से पहले मुझे अपने लटका आवेदन को खराब कर दिया गया था।

0

QThreads समाप्ति के दौरान "स्वाभाविक रूप से" समाप्त होने पर डेडलॉक कर सकते हैं।

उदाहरण के लिए यूनिक्स में, अगर धागा "पढ़ने" कॉल पर प्रतीक्षा कर रहा है, तो समाप्ति प्रयास (यूनिक्स सिग्नल) थ्रेड नष्ट होने से पहले एक त्रुटि कोड के साथ "पढ़ने" कॉल को रोक देगा।

इसका मतलब है कि समाप्त होने के दौरान धागा अभी भी इसके प्राकृतिक निकास बिंदु तक पहुंच सकता है। जब ऐसा होता है, तो कुछ आंतरिक म्यूटेक्स पहले से ही "समाप्त" कॉल द्वारा लॉक होने के बाद से एक डेडलॉक पहुंच जाता है।

मेरा कामकाज वास्तव में यह सुनिश्चित करना है कि थ्रेड कभी वापस समाप्त होने पर लौटाता है।

while(read(...) > 0) { 

    // Do stuff... 
} 

while(wasTerminated) 
    sleep(1); 

return; 

यहाँ wasTerminated वास्तव में थोड़ा और अधिक जटिल कार्यान्वित किया जाता है, परमाणु ints का उपयोग कर:

अधिक आम "क्यूटी" टैग शामिल करने
enum { 

    Running, Terminating, Quitting 
}; 

QAtomicInt _state; // Initialized to Running 

void myTerminate() 
{ 
    if(_state.testAndSetAquire(Running, Terminating)) 
    terminate(); 
} 

void run() 
{ 
    [...] 

    while(read(...) > 0) { 

    [...] 
    } 

    if(!_state.testAndSetAquire(Running, Quitting)) { 
    for(;;) sleep(1); 
    } 
} 
संबंधित मुद्दे