2011-11-07 13 views
6

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

मुझे लगता है कि यह बहुत सारे संसाधनों का उपयोग कर रहा है, लेकिन पूरी तरह से सुनिश्चित नहीं है।

यहां मेरे प्रश्न हैं: 1. मैं कैसे बता सकता हूं कि मेरा धागा क्यों रोक रहा है? 2. यदि यह वास्तव में प्रसंस्करण से अधिक है तो मुझे क्या करना चाहिए? मुझे वास्तव में लागू करने के लिए इस कार्रवाई की जरूरत है।

Heres कुछ कोड im का उपयोग कर: धागा बनाने के लिए:

[NSThread detachNewThreadSelector:@selector(startReading) toTarget:self withObject:nil];

मैं किसी भी जानकारी की आवश्यकता, धन्यवाद इतना पोस्ट करेंगे!

अद्यतन मैं अब जीसीडी का उपयोग कर रहा हूं और यह मेरे लिए धागे को पॉप्युलेट करता है। हालांकि ओएस अभी भी धागे को मारता है।

मुझे पता है कि यह वास्तव में कब हो रहा है। जब मैं अपना [एवीप्लेयर प्ले] बताता हूं; यह धागे को मारता है।

यह समस्या केवल वास्तविक आईपैड में और सिम्युलेटर

+0

यदि आपको पूछना है, तो प्रेषण कतार (जीसीडी) या ऑपरेशन कतार (NSOperationQueue) जैसे उच्च स्तर के अमूर्तता का उपयोग करने का प्रयास करें।देखें [थ्रेड से दूर ले जाएं] (http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/ConcurrencyandAplicationDesign/ConcurrencyandApplicationDesign.html#//apple_ref/doc/uid/TP40008091-CH100- SW8) एक विस्तारित चर्चा के लिए, या एक [जीसीडी] (http://stackoverflow.com/questions/7941860/#7941898) या [NSOperationQueue] (http://stackoverflow.com/questions/830218/) उदाहरण के लिए देखें। यह बहुत उपयोगी चीजें है। – Jano

+1

आपके ऐप को क्रैश करता है? यदि ऐसा है तो दुर्घटना रिपोर्ट क्या कहती है? क्या आप सुनिश्चित हैं कि AVPlayer थ्रेडसेफ है? क्योंकि यदि आप [AVplayer play] को कॉल कर रहे हैं और पृष्ठभूमि थ्रेड में एक ही समय में इसे एक्सेस कर रहे हैं, तो यह समस्या हो सकती है। – JeanLuc

+0

क्या आपका निष्कर्षण थ्रेड पृष्ठभूमि धागे के रूप में चल रहा है? मैं उद्देश्य-सी सीख रहा हूं, लेकिन यदि आप पृष्ठभूमि थ्रेड के रूप में इसे चलाने में सक्षम हैं तो ओएस द्वारा मारने में मदद नहीं कर सकता है। –

उत्तर

0

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

प्रदर्शित नहीं करता है) AV Foundation Programming Guide, under "Playing Assets" एप्पल राज्यों में:।

हालांकि अंत में आप एक परिसंपत्ति खेलना चाहते हैं, तो आप एक AVPlayer वस्तु को सीधे संपत्ति प्रदान नहीं करते। इसके बजाय, आप AVPlayerItem का एक उदाहरण प्रदान करते हैं। एक खिलाड़ी वस्तु उस संपत्ति की प्रस्तुति स्थिति का प्रबंधन करती है जिसके साथ यह जुड़ा हुआ है। एक प्लेयर आइटम में प्लेयर आइटम ट्रैक होते हैं-AVPlayerItemTrack के उदाहरण- जो संपत्ति में ट्रैक के अनुरूप होते हैं।

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

तो मुझे आश्चर्य हुआ- क्या आप अपनी संपत्तियों तक पहुंचने के लिए AVPlayerItems का उपयोग कर रहे हैं, जो दोनों परिचालन एक बार में होने देंगे? यदि हां, तो कम से कम उस विशिष्ट दिशा को अस्वीकार कर दिया गया है। लेकिन यदि नहीं, तो यह देखने के लायक हो सकता है कि यह समस्या को हल करता है या नहीं।

स्ट्रॉ पर grasping हो सकता है। लेकिन कहीं कहीं नेतृत्व हो सकता है।

+0

अब मैं इस तथ्य के बारे में जानता हूं कि जब मैंने इस संपत्ति के साथ एवीप्लेयर शुरू किया, तो मैंने संपत्ति से फ्रेम पढ़े, धागा रुक रहा है लेकिन मैं इसे कैसे बाईपास कर सकता हूं? –

+0

यदि आप AVPlayerItem के माध्यम से संपत्ति तक नहीं पहुंच रहे हैं, तो आपको संपत्ति चलाने के लिए एक AVPlayerItem इंस्टेंस प्रदान करना चाहिए, और संपत्ति से फ्रेम पढ़ने के लिए एक दूसरा AVPlayerItem उदाहरण प्रदान करना चाहिए। यह दोनों एक साथ होने की अनुमति देनी चाहिए। –

+0

मैं संपत्ति चलाने के लिए AVPlayer परिसंपत्ति का उपयोग कर रहा हूं लेकिन फ्रेम को पढ़ने के लिए नहीं। इसके लिए मैं AVAssetReader का उपयोग कर रहा हूं जिसे संपत्ति के साथ ही शुरू किया गया है। आप ऐसा करने का सुझाव कैसे देंगे? –

0

खंड में एप्पल के थ्रेडिंग प्रोग्रामिंग गाइड के 'एक सूत्र के ढेर आकार करना', पेज 27 का कहना है:

iOS और Mac OS X v10.5 में और बाद में, आवंटित और एक NSThread वस्तु को प्रारंभ (: toTarget: withObject: detachNewThreadSelector का उपयोग नहीं करते विधि)

हालांकि पेज में 22 का कहना है detachNewThreadSelector तरीके NSThread का उपयोग कर धागे बनाने के लिए में से एक है।

और यह कैसे अपने धागा शुरू करने के लिए की पेज 23 में इस उदाहरण देता है:

NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil]; 
[myThread start]; 

गाइड आप अपने ऐप्लिकेशन में एक अलग धागा पैदा करेगा के अनुसार। इस तरह अपना धागा बनाने का प्रयास करें और देखें कि ओएस आपके धागे को मारने से रोकता है या नहीं।

संदर्भ यहाँ के लिए गाइड करने के लिए कड़ी है

http://developer.apple.com/library/ios/iPad/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html#//apple_ref/doc/uid/10000057i-CH15-SW2

यह भी पेज 29 में उल्लेख है कि आपके ऐप में, प्रबंधित स्मृति मॉडल है, जो लगता है कि आप कर रहे हैं का उपयोग करता है अपने सूत्र में एक autorelease पूल बनाने कि एंट्री रूटीन पहली चीज होनी चाहिए जो आप करते हैं और इसी तरह इसे अपने धागे की आखिरी चीज़ को नष्ट कर दें। यह सुनिश्चित नहीं है कि इससे आपके धागे की हत्या हो जाएगी लेकिन यह सत्यापित करने के लिए कि आप ऐसा करते हैं।

अपने थ्रेड एंट्री रूटीन में एक कोशिश/पकड़ ब्लॉक होने से हत्या की समस्या का समाधान नहीं हो सकता है, लेकिन आपके थ्रेड में कोई त्रुटि होने पर आपके ऐप से बाहर निकलने से बच निकलेगा।

मैं इस अन्य डिज़ाइन टिप का उल्लेख करना भूल गया जो संसाधन बाधाओं के साथ आपकी सहायता कर सकता है, जैसा कि डंकन ने उल्लेख किया था। गाइड पेज 18 के अनुसार:

बचें साझी डाटा संरचनाओं

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

जो, मुझे लगता है कि आप इसे अपने ऐप में कर सकते हैं। डंकन ने जो भी उल्लेख किया है, उसके अलावा "एवीप्लेयर ऑब्जेक्ट को सीधे संपत्तियां प्रदान न करें बल्कि इसके बजाय AVPlayerItem का एक उदाहरण प्रदान करें", क्या यह आपके प्रत्येक थ्रेड के लिए अलग-अलग उदाहरण बनाते हैं, प्लेयर थ्रेड के लिए एक AVPlayerItem उदाहरण और एक AVPlayerItem उदाहरण के लिए निष्कर्षण धागा।

1

यह मुझे लगता है जैसे आप एक ही समय में दो वीडियो क्लिप को डीकोड करने का प्रयास कर रहे हैं। आईपैड की हार्डवेयर आधारित डिकोडिंग प्रकृति के कारण, यह एक समय में केवल एक डिकोड प्रक्रिया का समर्थन कर सकता है। जब आप एक नया आइटम खेलते हैं तो पुराना रद्द कर दिया जाएगा। यह समझाएगा कि यह सिम्युलेटर में क्यों काम करता है, लेकिन डिवाइस पर नहीं।

समाधान के लिए, आप libav (जीपीएल) या CoreAVC SDK (वाणिज्यिक) जैसे शुद्ध सॉफ़्टवेयर डिकोडर पर स्विच कर सकते हैं। इस तरह आप प्लेबैक के लिए एचडब्ल्यू डिकोडर में हस्तक्षेप नहीं करेंगे।