2012-04-06 12 views
9

मेरे पास लगभग 1000 QGraphicsItems के साथ एक QGraphicsScene है, जो वास्तव में भौतिकी आइटम हैं। प्रत्येक फ्रेम जो वे आगे बढ़ते हैं, टकराव की जांच करते हैं, और उन चीजों को हल करते हैं, अन्य चीजों के साथ। मैं वास्तव में भौतिकी multithreaded करना पसंद करेंगे।क्यूटी भौतिकी दृश्य मल्टीथ्रेडिंग

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

केवल एक परिकल्पना है: क्या मैं QGCraphcurrent का उपयोग QGraphicsItems की सूची में एक विधि चलाने के लिए कर सकता हूं? अगर मैं अपने भौतिकी विधि (जो कि मेरे क्यूग्राफिक्स इटैम के गुणों को बदल देगा) में मेरे क्यूग्राफिक्स इटिम पेंट विधि और क्यूएमयूटीएक्स में क्यूएमयूटीएक्स का उपयोग करता है, तो क्या यह गारंटी देगा कि केवल एक थ्रेड प्रत्येक QGraphicsItem को किसी भी समय पठन/लिख रहा है?

+0

मैंने सिग्नल/स्लॉट को कनेक्ट करते समय QueuedConnection का उपयोग करने के बारे में कुछ पढ़ा है। मैंने कोशिश नहीं की है या यहां तक ​​कि विवरणों को भी देखा है, लेकिन मुझे लगता है कि यह आगे की जांच के लायक है। क्या किसी और के पास इसका अनुभव है? – aldo

+0

मैंने बॉक्स 2 डी के डेल्फी बंदरगाह का उपयोग किया और मैं इससे बहुत संतुष्ट हूं। कोशिश क्यों न करें? यदि आप रुचि रखते हैं तो इस [पेज] (http://labs.qt.nokia.com/2010/02/26/qt-box2d-is-easy/) पर जाएं। – menjaraz

+0

Box2D दिलचस्प लग रहा है, लेकिन मुझे कहीं भी नहीं दिखाई देता है कि यह बहुप्रचारित है। – Joel

उत्तर

2
  1. अगर मैं अपने QGraphicsItem रंग विधि में एक QMutex और मेरे भौतिकी विधि में एक QMutex (है कि मेरे QGraphicsItem के गुणों बदल जाएगा), होगा इस गारंटी नहीं है कि केवल एक धागा पढ़ रहा है/प्रत्येक लेखन का उपयोग QGraphicsItem समय में किसी एक पल में?

    नहीं, ऐसा नहीं होगा। चित्रण करते समय QGraphicsItem भारी उपयोग किया जाता है, न केवल paint विधि कहा जाता है। देखो, उदाहरण के लिए, here। यहां तक ​​कि अगर यह काम कर सकता है, तो यह बदसूरत समाधान होगा, क्योंकि स्पष्ट रूप से, QGraphicsItem न केवल चित्रकला के लिए उपयोग किया जा सकता है।

  2. एक संकेत/स्लॉट प्रणाली का उपयोग करके अंतिम आइटम गुण (एक्स, वाई, रोटेशन) मुख्य थ्रेड पर प्रत्येक फ्रेम भेजने के लिए इस बल मुझे क्या, और फिर वास्तव में अद्यतन करने के लिए एक मुख्य थ्रेड विधि का उपयोग QGraphicsItems? या ऐसा करने का एक आसान तरीका है?

    हां, आपको आइटम बदलने की प्रक्रिया को मुख्य धागे में ले जाना है। आपके पास वास्तव में कुछ विकल्प हैं:

    • जैसा कि आपने बताया है, सिग्नल/स्लॉट तंत्र का उपयोग करें।
    • meta-callsQueuedConnection
    • कस्टम ईवेंट भेजें।

    भूलें कि आपके पास BlockingQueuedConnection है, यदि आप चित्रकला समाप्त होने की प्रतीक्षा करना चाहते हैं।

    इसके अलावा, आप इन सभी चीजों का उपयोग QtConcurent के साथ कर सकते हैं।

असल में, प्रबंधन करना इतना मुश्किल नहीं है। मैन्युअल रूप से थ्रेड सुरक्षा सुनिश्चित करने से, यह अधिक सुरक्षित और आसान है।

बड़ा समस्या यह है कि आप शायद भी विफल हो सकता है जब करने की कोशिश कर आइटम पढ़ कार्यकर्ता सूत्र में (उदाहरण के लिए केवल const सदस्य ही उपयोग करते हुए,) है।

जहाँ तक, QGraphicsItem के रूप में सुरक्षित थ्रेड नहीं है, यहां तक ​​कि पढ़ने नहीं है। और क्यूटी में मल्टीथ्रेड ऐप विकास का मेरा अनुभव मुझे बताता है कि अगर कुछ बुरा हो सकता है, तो होगा।

+0

उत्तर के लिए धन्यवाद। एक प्रश्न: यदि मैंने एक कक्षा बनाई है जो QGraphicsItem को विरासत में लेती है, और कुछ कस्टम गुण (रंग, वेग, आदि) जोड़ती है, तो क्या मैं उन्हें किसी अन्य थ्रेड से संशोधित कर सकता हूं? क्या मैं तब तक ठीक रहूंगा जब तक कि मैं सुनिश्चित करता हूं कि केवल एक धागा किसी भी समय प्रत्येक संपत्ति को पढ़/लिख रहा हो? – Joel

+0

@ जोएल, अगर वे अन्य विरासत सदस्यों का उपयोग नहीं करते हैं, तो आप कर सकते हैं। लेकिन मैं इस मामले में बेहतर विरासत का उपयोग करना चाहता था (_your_ में 'क्यूग्राफिक्स इटैम' को एक ज्ञापन के रूप में शामिल किया गया है), क्योंकि इस मामले में वे गुण कुछ अलग-अलग लक्ष्यों की सेवा करते हैं, वास्तव में _extend_ 'QGraphicsItem' नहीं। मैं व्यक्तिगत रूप से सोचता हूं, यह स्पष्टता में वृद्धि करेगा। – Lol4t0

+0

मुझे यकीन नहीं है कि मेरे मामले में एकत्रीकरण कैसे काम करेगा। बस इतना स्पष्ट है कि, मैं चाहता हूं कि मेरी कक्षा पेंट विधि को दोबारा लागू करे। मुझे यकीन नहीं है कि मैं QGraphicsItem विरासत के बिना ऐसा कैसे करूंगा। – Joel