2012-11-20 15 views
23

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

semaphore_wait_trap() 

करने के लिए कॉल

मैं फांसी धागा निलंबित कर सकते हैं (मेरे कार्यकर्ता कतार) है कि वहाँ जाल दूर चला जाता है और जीयूआई फोन पर एक बार फिर उत्तरदायी हो जाता है।

कार्यकर्ता धागे को रोकने के बाद जीयूआई 1-2 सेकंड के लिए उत्तरदायी है (मुझे संदेह है कि यह धागा फिर से सक्रिय हो जाता है) और फिर यूआई एक बार फिर उत्तरदायी नहीं हो जाता है।

यह धागा मुख्य थ्रेड के लिए कोई dispatch_sync() कॉल करता है/कतार

क्या यह संभव है कि आईओएस मुख्य थ्रेड रुक जाता है ("जाल" यह), क्योंकि कार्यकर्ता लंबी चलने वाली है?

क्या मैं इसे ब्लॉक को हटाने के लिए मजबूर कर सकता हूं ??

मैं डीबग मोड स्टैक की कुछ प्रिंट स्क्रीन जोड़ रहा हूं।

Main Queue Stack

और फांसी धागा:

फांसी कतार निलंबन से पहले

Hanging Queue

और रोकने पर और बुरा कतार निलंबित करने के बाद:

After Suspending

+0

क्या आप "pixtr" या तृतीय पक्ष उत्पाद है? । अगर इसकी तीसरी पार्टी मैं इसे अपने यूआई से अलग करने पर विचार करूँगा यह देखने के लिए कि क्या समस्या –

+0

यहां पर बहुत कुछ नहीं है (विशेष रूप से, मुझे नहीं पता कि 'add_blob' में क्या है), तो मेरे पास सबसे अच्छा अनुमान है । मेरा संदेह यह है कि आप 'cvFloodFill' में गलत झंडे गुजर रहे हैं और इससे GPU को लॉक करना बंद हो जाता है। चूंकि यूआईकिट भी स्क्रू की गणना करने के लिए जीपीयू चाहता है (डीवाईट्रांसपोर्ट जीपीयू गणना से संबंधित एक निजी ढांचा है), यह यूपीकिट को जीपीयू उपलब्ध होने के लिए इंतजार कर रहा है। –

उत्तर

2

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

dispatch_async(dispatch_get_main_queue(), ^{ 
       //do some main thread job here 
      }); 
) 
+0

मैं पृष्ठभूमि कार्यकर्ता धागे से कोई ui कॉल नहीं करता हूं। –

+0

मैं dispatch_queue_create ("worker_queue", DISPATCH_QUEUE_SERIAL) कर रहा हूं; –

+0

dispatch_async (my_queue, {पूरा होने पर कॉलबैक के साथ कार्यकर्ता ब्लॉक}) –

0

हो सकता है कि तुम सिर्फ (प्रेषण समारोह कॉल में एक चर बनाए रखने के लिए मेरे लिए मैं बाहर रखा गया था भूल गया है एक dispatch_once_t घोषणा और प्रेषण से पहले स्थैतिक कीवर्ड इनलाइन फ़ंक्शन के साथ संसाधित नहीं कर सकता है)। स्टैक ट्रेस बस तुम्हारी तरह था। वह मेरी गलती थी।

+ (instancetype)sharedInstance 
{ 
    (static was omitted) dispatch_once_t once; 
    static id sharedInstance; 
    dispatch_once(&once, ^{ 
     sharedInstance = [[self alloc] init]; 
    }); 
    return sharedInstance; 
} 
संबंधित मुद्दे