2009-06-08 9 views
6

कहें, मुझे कोड का एक समूह चलाने की ज़रूरत है जो क्रैश होने की संभावना है इसलिए मुझे इसे एक अलग प्रक्रिया पर चलाने की आवश्यकता है। आम तौर पर मैं इसे इस तरह करना चाहते हैं:Qt4 आवेदन में "कांटा()" के लिए पोर्टेबल तरीका?

pid = fork(); 
    if (pid == -1) { 
    std::cout << "Cant Spawn New Thread"; 
    exit(0); 
    } else if (pid == 0) { 
    std::cout << "Im a child that will crash\n"; 
    char *foo = (char *) 0xffff; 
    std::cout << foo; 
    exit(0); 
    } else { 
    std::cout << "PID: " << pid << "\n"; 
    } 
    do { 
    std::cout << "Waiting for " << pid << " to finish .. \n"; 
    pid_w = waitpid(pid,&status,0); 
    } while (pid_w == -1); 

जाहिर है मैं सिर्फ अपनी क्यूटी 4 आवेदन में कांटा का उपयोग कर सकते, लेकिन अगर मुझे लगता है कि क्यूटी 4 प्रदान करता है किसी भी कुछ भी या किसी पोर्टेबल ढंग का सहारा के बिना साथ ही कार्यक्षमता संग्रह कर सकते हैं मैं सोच रहा हूँ वास्तुकला का गुच्छा #ifdefs?

किसी भी मामले में, मैं इस ऐप को केवल pthread कार्यान्वयन के लिए लक्षित कर रहा हूं लेकिन मैं अभी भी चीजों को जितना संभव हो सके "मूल" क्यूटी एपीआई के करीब रखना चाहता हूं।

मैंने QThread का परीक्षण किया है, और थ्रेड में segfaulting पूरे एप्लिकेशन को स्पष्ट रूप से क्रैश करता है और ऐसा लगता है कि QProcess केवल पूरी तरह से अलग निष्पादन योग्य होने पर उपयोग किया जाने वाला लक्ष्य है। कोई अन्य विकल्प?

+3

क्या आपको पता है कि http://qtcentre.org पर एक क्यूटी मंच है? आप irc.freenode.net पर #qt चैनल पर भी पूछ सकते हैं अगर आपको यहां अपना जवाब नहीं मिलता है। –

+0

मैंने qtcentre की विकी से संभावित उदाहरणों को खोजने का प्रयास किया लेकिन मुझे कोई नहीं मिला, मैं बाद में #qt पर छोड़ दूंगा।) – rasjani

उत्तर

7

विंडोज फ्लैट-आउट में सार्वजनिक रूप से उपभोग्य तरीके से फोर्क() नहीं है, इसलिए इसका अनुकरण करने के लिए कोई क्यूटी कॉल नहीं है; आपको विशेष कमांड लाइन पैराम या कुछ के साथ खुद को शुरू करने की तरह कुछ करने की आवश्यकता होगी।

+0

ध्यान दें कि विंडोज़ पर 'कांटा() 'अनुकरण करने का एक तरीका है। सिगविन ऐसा करता है। हालांकि, यह काफी जटिल और धीमा है (यह सिर्फ पूरी याददाश्त की प्रतिलिपि बनाता है)। तो, संभवतः कोड को एक अतिरिक्त सहायक एप्लिकेशन में स्थानांतरित करने का बेहतर तरीका है जिसे आप उपप्रोसेसर में निष्पादित कर सकते हैं। या सुझाए गए विशेष कमांड लाइन पैरा के साथ एक ही ऐप शुरू करने के लिए। – Albert

1

क्या आपने कोशिश की है ... पकड़ने के बयान & क्रैशिंग से बचने के तरीके को समझना ????

+1

क्षमा करें, लेकिन यह कोई विकल्प नहीं है, जो क्रैश होता है * * को * क्रैश करना चाहिए यदि वह चाहता है और मेरे आवेदन को बस पकड़ना चाहिए और खुद को दुर्घटनाग्रस्त किए बिना टिकना जारी रखना चाहिए। – rasjani

+2

एवी को पकड़ने और उन्हें निगलने की कोशिश करना एक बड़ी सुरक्षा भेद्यता –

3

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

0

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