2011-06-01 21 views
12

मेरे क्यूटी आवेदन में, मेरे पास मुख्य धागा और एक कार्यकर्ता धागा है। कार्यकर्ता धागा subclasses QThread और customEvent के माध्यम से घटनाओं को संसाधित करता है। क्या यह मुख्य धागे के लिए कार्यकर्ता धागे द्वारा संसाधित होने के लिए घटनाओं को भेजने का सही तरीका है?क्यूटी: QThread पर ईवेंट पोस्ट करने का सही तरीका?

QThread* myWorkerThread = // ... 

QApplication::instance()->postEvent (myWorkerThread, new MyWorkRequestEvent(/* ... */); 

अगर मैं प्रलेखन सही ढंग से पढ़ें, यह कहा गया है कि घटनाओं उद्देश्य यह है कि घटना प्राप्तकर्ता खुद के धागे पर कार्रवाई की जाती है। चूंकि QThread मुख्य धागे द्वारा बनाया गया था, यह मुख्य धागे के स्वामित्व में है - तो क्या इस घटना को मुख्य धागे द्वारा संसाधित किया जाएगा (जो प्रतिद्वंद्वी होगा, और मेरे मामले में गलत होगा)?

उत्तर

15

आपकी समझ सही है और वास्तव में बहुत unintuitive :)

मुसीबत का एक बहुत QThread के लिए प्रलेखन कि QThread उपवर्गीकरण पता चलता है से आता है। यद्यपि क्यूथ्रेड का अपना इवेंट लूप है, लेकिन रन() विधि (उस थ्रेड में बनाए गए) में बनाए गए QObjects के लिए केवल ईवेंट और सिग्नल QThread ईवेंट लूप में संसाधित किए जाएंगे।

क्यूओब्जेक्ट सबक्लास में अपने थ्रेड तर्क को समाहित करना बेहतर है और फिर उस ऑब्जेक्ट को सादे QThread के उदाहरण पर ले जाएं। इसके बाद आप संकेतों का उपयोग कर उस QObject के साथ संवाद कर सकते हैं (जिसे थ्रेड सीमाओं में सही ढंग से कतारबद्ध किया जाएगा) या कस्टम ईवेंट।

इस similar question में कुछ लिंक हैं जो मदद करनी चाहिए।

+4

+1: चलो थ्रेडिंग का सही तरीका फैलाएं – SinistraD

-2

घटनाक्रम मुख्य घटना लूप द्वारा संसाधित होते हैं, जो QApplication या QCoreApplication में रहता है। तो यह अन्य धागे में QObjects पर ईवेंट भेजने के लिए समझ में नहीं आता है (जब तक कि आप कोई अन्य ईवेंट लूप नहीं बनाते जो मुझे यकीन नहीं है)।

आप अन्य धागे से ईवेंट को अपने मुख्य धागे में भेज सकते हैं, हालांकि। आपके उदाहरण में myWorkerThread मुख्य थ्रेड के स्वामित्व में है, क्योंकि यह वहां बनाया गया है। run() में आपके कार्यकर्ता थ्रेड द्वारा बनाए गए ऑब्जेक्ट्स और नीचे इस धागे के स्वामित्व में हैं।

आप अन्य धागे में स्लॉट्स को सिग्नल भेज सकते हैं, उदाहरण के लिए यदि आप अपने कार्यकर्ता धागे या इसी तरह से एक विजेट (जो मुख्य धागे में किया जाना चाहिए) खींचना चाहते हैं।

+4

QThreads का अपना ईवेंट लूप होता है लेकिन QThread पर पोस्ट की गई घटनाओं को उस लूप में संसाधित नहीं किया जाएगा। –

+0

मैंने अभी दस्तावेज़ की जांच की है, मुझे नहीं पता था कि QThread का अपना इवेंट लूप है ^^ लेकिन इसे 'exec()' के साथ स्पष्ट रूप से शुरू किया जाना चाहिए जो वास्तव में कार्यकर्ता धागे में समझ में नहीं आता है, क्योंकि यह वापस नहीं आएगा जब तक 'छोड़ें() 'कहा जाता है। 3 पैराग्राफ के लिए – hirschhornsalz