2009-09-06 6 views
23

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

अब मैं क्यूटी का उपयोग करके एक और जीयूआई लागू करने जा रहा हूं। Qt documentation का कहना है कि सभी जीयूआई संबंधित कार्यों को मुख्य धागे में किया जाना चाहिए। मेरे मामले में, कभी-कभी QCoreAplication :: processEvents() मुख्य थ्रेड में कॉल करना उनके बीच बड़ी देरी के कारण लगभग बेकार होगा।

क्या क्यूटी की इस बाधा को दूर करने का कोई तरीका है? क्या क्यूटी कार्यक्रम के मुख्य धागे से संबंधित गैर-जीयूआई कुछ करना असंभव है?

+4

आप अपने काम को किसी अन्य धागे पर क्यों नहीं कर सकते? – Kornel

+1

सिर्फ ऐतिहासिक कारणों से। रिफैक्टरिंग दर्द होगा, इसलिए अगर यह टालने योग्य है तो मैंने कुछ शोध किया। – Basilevs

उत्तर

20

नहीं, आपको अपनी गणना अलग थ्रेड में करनी चाहिए। जैसा कि आपने पहले ही उल्लेख किया है, QCoreApplication::processEvents() में एक कार्य-आसपास उपलब्ध है, लेकिन ऐसा लगता है कि आप यह काम करने में असमर्थ हैं।

यदि आप QThread स्थापित करने और अपने सभी कोड को स्थानांतरित करने के सभी काम नहीं करना चाहते हैं, तो आप पाएंगे कि QtConcurrent::run फ़ंक्शन उपयोगी है - यह आपको एक कार्य को असीमित रूप से चलाने की अनुमति देता है।

कुछ पॉइंटर्स: आपको अपना मुख्य (जीयूआई) धागा जितना संभव हो उतना प्रकाश रखना चाहिए और रखना चाहिए। IO या गणनाओं की बड़ी मात्रा को QtConcurrent :: रन का उपयोग करके अतुल्यकालिक रूप से किया जाना चाहिए, या एक अलग QThread के अंदर चलाया जाना चाहिए। आपके कोड की जटिलता के आधार पर, आप QtConcurrent विधि से दूर हो सकते हैं।

+1

मुझे QThread के बजाय QtConcurrent :: run() का उपयोग करने का बड़ा लाभ नहीं दिखाई देता है। यह वास्तव में इस तरह से अधिक काम है। QThread के साथ चिपकें, –

+2

को लागू करने के लिए यह बहुत आसान है यह आपके द्वारा किए जा रहे कार्यों और आपके प्रोग्राम को कैसे संरचित किया जाता है, इस पर निर्भर करता है। यदि आपको स्थायी थ्रेड की आवश्यकता है जो हमेशा चलाना चाहिए तो QThread का उपयोग करें। यदि आपको चलाने के लिए कई छोटे (अक्सर स्वतंत्र) कार्यों की आवश्यकता है, और आपको परवाह नहीं है कि कौन से समय चल रहे हैं, तो QtConcurrent का उपयोग करें। – Thomi

+0

हाँ मैं सहमत हूं कि मैं इस पर थोड़ा मुश्किल हो सकता था ... जैसा कि आप कहते हैं कि यह आपकी जरूरत पर निर्भर करता है। –

4

अन्य धागे पर लंबी गणनाओं को ऑफ़लोड करना सबसे अच्छा है, इसलिए मुख्य जीयूआई थ्रेड उत्तरदायी बना रहता है। चीजों को करने का पुराना स्कूल अनप्रोसेसिंग तरीका यह सुनिश्चित करना होगा कि जीयूआई इवेंट हैंडलर मतदान किए बिना आपकी गणना कभी भी लंबे समय तक नहीं चलती है, लेकिन यह बहु-कोर तक स्केल नहीं करती है।

सौभाग्य से क्यूटी उत्कृष्ट threading support है। अतीत में आपको, QMutex, QWaitCondition आदि का उपयोग करके थ्रेड-पूल में खेतों को खेती करना होगा, लेकिन हाल ही में क्यूटी रिलीज ने QThreadPool, QtConcurrent::run और QFuture जैसे उच्च स्तरीय abstractions के साथ चीजों को आसान बना दिया है। ।

+1

थ्रेड के बीच QObject के कनेक्शन का उपयोग क्यों नहीं करें? –

0

मुझे नहीं पता कि अगर आप QApplication :: exec() को किसी अन्य थ्रेड से कॉल करते हैं तो यह कैसे होगा, जो तब आपका गुई थ्रेड बन जाता है। एक विचार है।

(हमें बताएं कि यह काम करता है, तो यह दिलचस्प होगा ...)

+0

आप ऐसा क्यों करना चाहते हैं?यदि आपको अपने कोड को थूकने के लिए काम करने की ज़रूरत है और इसे एक अलग थ्रेड पर आधा भाग चलाएं तो आप इसे ठीक से भी कर सकते हैं ... या क्या मुझे कुछ याद आ रहा है? – Thomi

+0

मैं सिफारिश नहीं कर रहा हूं, मैं सिर्फ ओपी से पूछताछ के तरीके को प्राप्त करने के बारे में एक सुझाव दे रहा हूं। कारण अन्य पुस्तकालय हो सकते हैं जिनके लिए मुख्य धागे में किए गए सामान की आवश्यकता होती है। (आईआईआरसी, ओपनएसजी 1.x आवश्यक थ्रेडिंग में लोडिंग और लोडिंग की आवश्यकता है, इसलिए वहां हमने मुख्य थ्रेड में भारी ओपनजीएल ड्राइंग के साथ समाप्त किया (चूंकि हमने उस थ्रेड में सभी ग्राफिक्स लोड किए हैं)। जीयूआई भी वहां चलने के लिए मजेदार नहीं है , लेकिन यह इस तरह से चला गया। (यह 2.x, आईआईआरसी में तय है) – Macke

+1

आप इसे कर सकते हैं, हमने इसे एक साधारण एप्लिकेशन के साथ किया और यह काम किया। लेकिन जब हमारा प्रोग्राम बंद हो जाता है तो हमें एक अवैध मुफ्त() त्रुटि मिलती है या एक डबल फ्री() त्रुटि। – dgrant

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

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