2012-10-23 23 views
6

मेरे पास एक पृष्ठभूमि धागा है जो काम का एक गुच्छा कर रहा है - एप्लिकेशन लोड हो रहा है। मुख्य धागा UIProgressView पर प्रगति प्रदर्शित कर रहा है।एक धागा कैसे निर्धारित कर सकता है कि एक अलग धागा दुर्घटनाग्रस्त हो गया है?

पृष्ठभूमि धागा performSelectorInBackground साथ पैदा की जा रही है (हालांकि, मैं इस विधि के लिए शादी नहीं कर रहा हूँ अगर एक अलग दृष्टिकोण इस समस्या को हल करने के लिए आसान बनाता है)

[self performSelectorInBackground:@selector(loadAppInBackground) withObject:self]; 

एक जोड़े अवसरों पर एक बग का कारण है पृष्ठभूमि थ्रेड क्रैश करने के लिए (ऐप के रूप में अलग-अलग बग) जिसके परिणामस्वरूप प्रगति पट्टी रोकती है, लेकिन उपयोगकर्ता को कोई स्पष्ट संकेत नहीं मिलता है कि कुछ भी गलत है।

मैं इस स्थिति का पता लगाना चाहता हूं और उपयोगकर्ता प्रतीक्षा करने तक बस लटकने से अधिक प्रसन्नतापूर्वक विफल रहता हूं।

क्योंकि लोड प्रक्रिया की अवधि काफी भिन्न हो सकती है, बस समय समाप्त करना एक आदर्श विकल्प नहीं है।

अग्रभूमि धागे का पता लगाने के लिए सबसे अच्छा तरीका क्या है कि पृष्ठभूमि धागा विफल हो गया है? चूंकि फोरग्राउंड थ्रेड यूआई से निपटने में व्यस्त है, तो क्या पहले की निगरानी करने के लिए इसे दूसरी पृष्ठभूमि थ्रेड की आवश्यकता होगी? वह बदसूरत लगता है।

क्या कुछ थ्रेड-टू-थ्रेड संचार तंत्र है जिसका उपयोग पृष्ठभूमि प्रक्रिया को "पिंग" करने के लिए किया जा सकता है? बेहतर अभी तक, अन्य धागे की स्थिति की जांच करने के लिए निम्न स्तर की प्रणाली तंत्र?

डीबगर को चल रहे सभी थ्रेड के बारे में पता है ... और उनकी स्थिति पता है। मैं सोच रहा हूं कि मेरे ऐप को ऐसा करने के लिए कोई कॉल उपलब्ध है या नहीं।

+1

आप इस पृष्ठभूमि के काम को कैसे प्रेषित कर रहे हैं (जीसीडी, एनएसओपरेशंस, एनएसटीएचडीएस)? जवाब आपके कार्यान्वयन पर निर्भर करता है। – CodaFi

+0

[स्वयं प्रदर्शन चयनकर्ताबैकग्राउंड: @ चयनकर्ता (loadAppInBackground) ऑब्जेक्ट: स्वयं]; –

+0

टाइमआउट ज्यादातर उपयोग की जाने वाली तकनीक है। क्योंकि यह निर्धारित करना असंभव है कि धागा सामान्य रूप से या अनंत लूप (समस्या को रोकना) में चल रहा है या नहीं। तो आपका अग्रभूमि जांच सकता है कि पृष्ठभूमि कार्य 1 सेकंड (स्थानीय I/O, या नेटवर्क I/O के लिए 15 ~ 60 सेकंड) में पूरा हुआ है या नहीं। क्षमा करें, मैं केवल एक अस्पष्ट सुझाव दे सकता हूं क्योंकि आप एक सामान्य समस्या पूछ रहे हैं। – HKTonyLee

उत्तर

0

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

मैं कुछ और अधिक सरल, भरोसेमंद और वास्तविक समय की उम्मीद कर रहा था।

मैं धागे में अपवाद को पकड़ने के साथ प्रयोग करने जा रहा हूं और शायद "पृष्ठभूमि थ्रेड अपवाद" जैसी अधिसूचना उत्पन्न कर रहा हूं कि अग्रभूमि धागा सुन सकता है और प्रतिक्रिया दे सकता है।

1

यदि पृष्ठभूमि कार्य किसी प्रकार के नियमित चक्र में चलता है (उदाहरण के लिए, एक बड़ा लूप है जहां अधिकांश काम किया जाता है), यह हर बार एक झंडा सेट कर सकता है यह इंगित करने के लिए कि यह अभी भी जीवित है।

ऐसा करने का एक तरीका है पृष्ठभूमि थ्रेड स्टोर [NSDate timeIntervalSinceReferenceDate] कहीं और, और अपने मुख्य धागे में, कभी-कभी (शायद टाइमर पर) वर्तमान समय की तुलना में। यदि अंतर कुछ उचित सीमा से अधिक है तो आप अनुमान लगा सकते हैं कि पृष्ठभूमि धागा मर गया है।

एक और तरीका पृष्ठभूमि थ्रेड को बस एक बूलियन सेट करना है, और मुख्य धागा पूछताछ करता है और इसे नियमित आधार पर साफ़ करता है। यदि बूलियन मुख्य थ्रेड पूछताछ के बीच फिर से सेट नहीं होता है तो आप अनुमान लगा सकते हैं कि यह मर गया है।

पहली तकनीक का लाभ यह है कि आप कोड को (या तो थ्रेड में) सहन करने के लिए "उचित सीमा" को "ट्यून" कर सकते हैं जो कि समय के कुछ अनियमित है। दूसरे दृष्टिकोण को आम तौर पर उन समय की आवश्यकता होती है जो अधिक अनुमानित हैं।

बेशक किसी भी दृष्टिकोण के साथ आप किसी भी तरह से "सीटी उड़ाने" से बचने के लिए चाहते हैं यदि पृष्ठभूमि धागा अभी खत्म हो गया है और आपने अभी तक इसे अभी तक पहचाना नहीं है।

+0

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

+0

@ डेव ओवेन्स - समस्या यह है कि "थ्रेड मौत" अक्सर लॉक पर हमेशा लटकती है या किसी प्रकार के लूप में पकड़ी जाती है, जो बस निष्पादित करने के लिए बंद हो जाती है। –

1

एक आम तकनीक है कि प्रश्न में थ्रेड के जीवन संकेतों की जांच करने के लिए एक अतिरिक्त धागा हो - एक तथाकथित दिल की धड़कन धागा। दिल की धड़कन धागे थ्रेड को जांचकर जांचता है कि क्या यह समय पर प्रतिक्रिया देता है, यदि नहीं, तो धागे को मृत मानता है और इसे समाप्त कर देता है।

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

+0

मुझे लगता है कि एक पूर्ण अंतिम उपाय के रूप में काम करेगा, लेकिन, क्योंकि कार्यों में अज्ञात गति और विश्वसनीयता के नेटवर्क पर अज्ञात आकार की फ़ाइलों को डाउनलोड करना शामिल है, यह स्पष्ट नहीं है कि पृष्ठभूमि धागा छोड़ने और मानने से पहले कितना समय है मृत। –

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