2009-03-31 12 views
9

मैं गुप्त ड्राइंग कर रहा हूँ एक CGContextCGBitmapContextCreate उपयोग करके बनाए गए, तो बाद में CGBitmapContextCreateImage साथ इसमें से एक CGImage पैदा करने और मेरे विचार पर ड्राइंग कि drawRect में (मैं भी उस के शीर्ष पर कुछ अन्य सामान ड्राइंग कर रहा हूँ करने के लिए - इस में एक अभ्यास है परिवर्तनशीलता और जटिलता के विभिन्न स्तरों को अलग करना)।कोर ग्राफिक्स/कोको का उपयोग करके, क्या आप पृष्ठभूमि थ्रेड से बिटमैप संदर्भ में आकर्षित कर सकते हैं?

यह सब ठीक काम करता है जब यह मुख्य धागे पर चल रहा है। हालांकि इस तरह से इसे विभाजित करने की प्रेरणाओं में से एक यह था कि ऑफस्क्रीन भाग पृष्ठभूमि थ्रेड पर चलाया जा सकता था (जिसे मैंने सोचा था क्योंकि यह ऑनस्क्रीन संदर्भ में प्रस्तुत नहीं हो रहा है)।

हालांकि, जब मैं ऐसा करता हूं तो परिणामी छवि खाली होती है! मैंने कोड पर जांच की है, और यह सत्यापित करने के लिए न्यायसंगत NSLog को रखा है कि सब कुछ सही क्रम में हो रहा है।

मेरा अगला कदम यह सबसे आसान कोड है जो इस मुद्दे को पुन: उत्पन्न करता है (या कुछ मूर्खतापूर्ण चीज़ ढूंढें जो मुझे याद आ रही है और इसे ठीक करें) - जिस बिंदु पर मेरे पास आवश्यक होने पर यहां पोस्ट करने के लिए कुछ कोड होगा। लेकिन मैं पहले यहां जांचना चाहता था कि मैं इसके साथ गलत रास्ते नहीं जा रहा हूं। मुझे गुगल्सफेयर के चारों ओर अपनी यात्रा में कुछ भी नहीं मिला जो प्रकाश को किसी भी तरह से बहाल करता है - लेकिन एक दोस्त ने उल्लेख किया कि पृष्ठभूमि पृष्ठभूमि में छवियों का आकार बदलने की कोशिश करते हुए वह एक समान मुद्दे में भाग गया - यह सुझाव देते हुए कि यहां कुछ सामान्य सीमा हो सकती है।

[संपादित करें]

प्रतिक्रियाओं के लिए धन्यवाद। यदि कुछ और नहीं तो उन्होंने मुझे बताया है कि कम से कम मैं इस के लिए जवाब नहीं देने में अकेला नहीं हूं - जो कि मैं जो खोजना चाहता था उसका हिस्सा था। इस बिंदु पर मैं अतिरिक्त संभव उदाहरण प्राप्त करने के लिए अतिरिक्त काम करने जा रहा हूं और कुछ कोड या अधिक जानकारी के साथ वापस आ सकता हूं। इस बीच में किसी भी विचार :-) आ

एक बात को लाने के लिए रखें: लोगों के एक जोड़े एपीआई के संबंध में अवधि धागा सुरक्षा इस्तेमाल किया है। यह ध्यान देने योग्य है कि इस संदर्भ में धागा सुरक्षा के दो प्रकार के होते हैं:

  1. एपीआई के ही Threadability - यानी यह एक से अधिक धागा (वैश्विक राज्य और अन्य फिर से entrancy मुद्दों इस तरह से सब पर इस्तेमाल किया जा सकता चूंकि सी के स्ट्रोक सामान्य कारण हैं कि एक एपीआई भी थ्रेड सुरक्षित नहीं हो सकता है)।
  2. व्यक्तिगत संचालन की परमाणुता - एकाधिक थ्रेड एपीआई के माध्यम से एप्लिकेशन स्तर लॉकिंग के बिना एक ही ऑब्जेक्ट्स और संसाधनों के साथ बातचीत कर सकते हैं?

मुझे संदेह है कि अब तक उल्लेख किया गया है कि पहले प्रकार का उल्लेख किया गया है, लेकिन अगर आप स्पष्टीकरण दे सकते हैं तो इसकी सराहना करेंगे।

[EDIT2 - हल]

ठीक है, मैं यह सब काम कर गया। कार्यकारी सारांश यह है कि समस्या बिटमैप संदर्भों के बजाय मेरे साथ थी।

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

तो इस सवाल को हिट करने वाले किसी भी व्यक्ति के लिए यह सोचकर कि क्या वे पृष्ठभूमि थ्रेड पर बिटमैप संदर्भ में आकर्षित कर सकते हैं, जवाब यह है कि आप (यहां दी गई चेतावनियों के साथ) और उत्तर में दिए गए हैं।

धन्यवाद सभी

+1

आपकी समस्या और समाधान के आपके विस्तृत विवरण ने मुझे यह पता लगाने में मदद की कि मेरे अपने कोड के साथ क्या गलत था। आपका बहुत बहुत धन्यवाद! – Kalle

उत्तर

3

बस एक अनुमान है, लेकिन यदि आप किसी अन्य थ्रेड से setNeedsDisplay को कॉल करने का प्रयास कर रहे हैं, तो आपको इसके बजाय performSelectorOnMainThread के माध्यम से कॉल करने की आवश्यकता है।

+0

दृश्य को आकर्षित करने के लिए उपयोग की जाती है। लेकिन मैं इसे मुख्य धागे से बुला रहा हूं। एकमात्र चीज जो मैं अन्य थ्रेड पर कर रहा हूं वह बिटमैप संदर्भ – philsquared

+0

पर चित्रित कर रहा है, मैं आपका स्वीकार कर रहा हूं क्योंकि यह कारण के सबसे नज़दीक हो गया है - भले ही यह मुझे सीधे नहीं ले जाये :-) – philsquared

0

सभी एपीआई थ्रेड-सुरक्षित नहीं हैं। कुछ को लॉकिंग की आवश्यकता होती है या आवश्यकता होती है कि वे मुख्य धागे पर चलें। आप प्रलेखन को खराब करना चाहते हैं। मेरा मानना ​​है कि एक ऐसा पृष्ठ है जो सारांशित करता है कि एसडीके के कौन से हिस्से थ्रेड-सुरक्षित हैं और जो नहीं हैं।

+0

धन्यवाद कैलोआ। मैं प्रतिक्रिया की सराहना करता हूं, लेकिन यह काफी है जहां से मैंने शुरू किया था। मैं और अधिक विशिष्टताओं की उम्मीद कर रहा था क्योंकि मेरे "डॉक्यूमेंटेशन को खराब करने" ने अभी तक कुछ भी निश्चित नहीं किया है। – philsquared

2

यदि आप CGContextRef के साथ एक और केवल एक थ्रेड में काम कर रहे हैं तो आप क्या कर रहे हैं। मैंने इसे 8 कोर के साथ एक छवि के 8 अलग-अलग हिस्सों पर काम करने से पहले किया है और उसके बाद अलग-अलग परिणामस्वरूप CGImageRefs को एक साथ कंपोजिट कर दिया है और उन्हें स्क्रीन पर खींचा है।

+0

धन्यवाद। मैंने अपने प्रश्न में इसका जिक्र नहीं किया, लेकिन आईफोन टैग जोड़ा, जो यहां महत्वपूर्ण हो सकता है या नहीं (जैसा कि रोजर नोलन ने भी अपने जवाब में बताया) – philsquared

1

ऐप्पल आईफोन पर थ्रेड सुरक्षा के बारे में कुछ भी नहीं कहता है लेकिन कोको (UIKit के विपरीत) generally thread safe for drawing है। चूंकि वे बहुत सारे ड्राइंग कोड साझा करते हैं, मुझे लगता है कि आईफोन पर ड्राइंग थ्रेडसेफ है।

उस ने कहा, आपके अनुभव से संकेत मिलेगा कि समस्याएं हैं। क्या यह हो सकता है कि आप इसे प्रस्तुत करने से पहले अपनी छवि का उपयोग कर रहे हैं?

+0

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

0

यदि कोई भी यह करने के लिए बिल्कुल सही खोज रहा है तो मैंने blog post लिखा है जो वर्णन करता है कि यह कैसे करें, और एनएसओपरेशन सबक्लास में पूरी चीज को लपेटें।