2013-08-20 21 views
7

मैं बहुत सारे बनावट अपलोड कर रहा हूं (60 वीजीए छवियां एक सेकंड) और यह मेरे यूआई थ्रेड को अवरुद्ध कर रहा है। the Qt 5.1 QGLWidget manual page (जोर मेरा):QGLWidget एक और धागे में? दस्तावेज का जिक्र क्या है?

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

क्या? एक QWLget- आधारित वर्ग जैसे QGLWidget को थ्रेड में कैसे स्थानांतरित किया जा सकता है? ऐसा करने का प्रयास करने में परिणाम:

QObject::moveToThread: Widgets cannot be moved to a new thread 

मुझे समझ में नहीं आता कि दस्तावेज क्या सुझाव दे रहा है जिसे मैं लागू करने के लिए लागू करता हूं। UI थ्रेड से bindTexture() निष्पादन।

यह भी यहाँ उल्लेख किया जाता है: Qt4/Opengl bindTexture in separated thread

कोई कोड वहाँ हालांकि तैनात।

उत्तर

3

मुझे कहना है कि मुझे याद नहीं है कि मैंने यह कैसे किया है, वैसे भी मुझे नहीं लगता कि QGLWidget को किसी अन्य थ्रेड में ले जाना चाहिए, और वास्तव में यह नहीं है कि दस्तावेज़ क्या कहता है। यह वर्तमान बनाने के लिए कहता है: QGLWidget::makeCurrent()। इससे नए धागे में उस QGLWidget वर्तमान का ओपनजीएल संदर्भ होगा।

हालांकि, मैं QGLContext कक्षा के साथ प्रयास करता हूं। आप QGLContext को तुरंत चालू कर सकते हैं और फिर QGLWonteget में से किसी एक के साथ साझा करने के लिए QGLContext :: create() को कॉल कर सकते हैं। QGLContext के साथ आप बनावट को बांध सकते हैं।

+0

हाँ। अधिक जानकारी [यहां] (http://blog.qt.digia.com/blog/2011/06/03/threaded-opengl-in-4-8/)। इसके अलावा, क्यूटी 5 में, आपको वास्तव में QOpenGL * कक्षाओं का उपयोग करना चाहिए, क्यूजीएल * वर्ग नहीं, जहां संभव हो। – peppe

6

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

QGLWidget *glWidget=new QGLWidget(); 
QThread *newThread=new QThread(); 

glWidget->doneCurrent(); 
glWidget->context()->moveToThread(newThread); 

यहाँ मैं केवल नए धागा करने के लिए ओपन संदर्भ ले जाते हैं, यह जरूरी है कि QGLWidget में कुछ ओवरराइड पकड़े जाते हैं और ध्यान न दें। आपको QGLWidget से एक नई व्युत्पन्न कक्षा बनाने और निम्न को ओवरराइड करने की आवश्यकता होगी।

virtual void glInit(); 
virtual void glDraw(); 

virtual void initializeGL(); 
virtual void resizeGL(int width, int height); 
virtual void paintGL(); 

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

अंतिम भाग QGLWidget के निर्माण में है।

QGLWidget (QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0) 
QGLWidget (QGLContext * context, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0) 
QGLWidget (const QGLFormat & format, QWidget * parent = 0, const QGLWidget * shareWidget = 0, Qt::WindowFlags f = 0) 

फिर आप ui QGLWidget और पिरोया GLWidget (ओवरराइड ऊपर उल्लेख किया है सब के साथ QGLWidget से derivided) बनाते समय करते धागा GLWidget बनाने सुनिश्चित करते हुए: निर्माण में मानकों में से एक स्थिरांक QGLWidget * shareWidget है आप QGLWidget को एक साझा विजिट के रूप में प्रदान करते हैं।यह 2 ओपनजीएल को साझा किए गए संदर्भित करेगा और आपको एक बनावट को लोड करने की अनुमति देगा जो दोनों देख सकते हैं। कोड कुछ इस तरह दिखना चाहिए:

QGLWidget *glWidget=new QGLWidget(); 
GLWidget *threadedWidget=new GLWidget(0/*parent*/, glWidget); 
QThread *newThread=new QThread(); 

threadedWidget->moveToThread(newThread); 

कोड के लिए जैसा कि मैंने हाल ही में मुख्य रूप से ओपन/OpenCL इंटरॉप के लिए लड़ी QGLWidgets का उपयोग कर एक छोटे से उदाहरण कार्यक्रम लिखा था, लेकिन यह एक एकल संदर्भ साझा करने ड्रा धागे में muliple QGLWidgets का उपयोग कर पता चलता है। कोड github पर है और एक विवरण यहां है http://www.krazer.com/?p=109

+0

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

+0

+1। लिंक निराश हैं, लेकिन यह एक बहुत ही अच्छी प्रतिक्रिया है और मैं वास्तव में आपको हमारे समुदाय के हिस्से के रूप में देखना चाहता हूं। – Mikhail

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