2013-07-15 22 views
6

आम तौर पर यदि मैं एक प्रक्रिया गहन कार्य में हूं, तो मैं यह सुनिश्चित करने के लिए QCoreApplication::processEvents() या QEventLoop::processEvents() पर कॉल कर सकता हूं ताकि मेरा प्रोसेसिंग अन्य सिग्नल और स्लॉट को अवरुद्ध न करे।मैं QThread पर ईवेंट कैसे संसाधित करूं?

हालांकि, अगर मैं एक नया QThread बना सकते हैं और है कि धागा करने के लिए एक कार्यकर्ता ले जाते हैं, तो मैं एक QCoreApplication या एक QEventLoop जिसके साथ processEvents() कॉल करने के लिए नहीं है।

अपना शोध से ऐसा प्रतीत होता है कि मैं नए QThread बनाने पर एक QEventLoop स्थापित करने के लिए सक्षम होना चाहिए, और फिर मुझे लगता है कि QEventLoop पर processEvents() कॉल कर सकते हैं।

हालांकि, मैं यह नहीं समझ सकता कि यह कैसे करें। मुझे लगता है कि यह ऐसा कुछ दिख सकता है:

QThread *thread = new QThread(this); 
Worker *worker = new Worker(this); 
QEventLoop *loop = new QEventLoop(); 

connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing())); 
connect(worker, SIGNAL(done()), thread, SLOT(quit())); 
connect(worker, SIGNAL(done()), loop, SLOT(quit())); 

worker->moveToThread(thread);  

//loop->exec() // blocks processing of this thread 
loop->moveToThread(thread); 

//loop->exec() // loop is not a member of this thread anymore and even 
       // if it was, this would block the thread from starting 
thread->start(); 
//loop->exec(); // loop is not a member of this thread anymore and even 
       // if it was, this would block this thread from continuing 

प्रत्येक स्थान पर मैं लूप शुरू करने का प्रयास करता हूं, किसी प्रकार का मुद्दा होता है। लेकिन अगर ऐसा कुछ भी काम करता है, तो मैं पर processEvents() कैसे कॉल करूं?

वैकल्पिक रूप से, QThread भी एक समारोह setEventDispatcher() और QAbstractEventDispatcher एक processEvents() कार्य है है, लेकिन मैं कुछ भी है कि QAbstractEventDispatcher उपवर्गों को खोजने के लिए प्रतीत नहीं कर सकते हैं।

QThread पर गहन कार्यकर्ता फ़ंक्शन के दौरान ईवेंट को संसाधित करने का उचित तरीका क्या है?

उत्तर

13

प्रलेखन के अनुसार, QCoreApplication::processEvents() कॉलिंग को जो भी थ्रेड कहा जाता है, उसे संसाधित करता है।

+2

आह! धन्यवाद! मैंने सोचा कि 'QCoreAplication :: processEvents()' का उपयोग करने के लिए मुझे एक नया 'QCoreAplication' बनाना होगा। लेकिन ऐसा लगता है कि मेरा 'QThread' अभी भी पूर्ववर्ती' QCoreAplication 'का हिस्सा है। –

+0

को यह नहीं पता था कि यह एक स्थिर विधि थी। धन्यवाद। –

-6

हालांकि, अगर मैं एक नया QThread बना सकते हैं और है कि धागा करने के लिए एक कार्यकर्ता ले जाते हैं, तो मैं एक QCoreApplication या एक QEventLoop जिसके साथ processEvents() कॉल करने के लिए नहीं है।

बिल्कुल - इसे कॉल न करें। आपको इसकी आवश्यकता नहीं है, आप इसे नहीं चाहते हैं।

+3

तो ... मैं 'QThread' पर ईवेंट कैसे संसाधित करूं? –

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