xcode

2012-05-03 23 views
5

में थ्रेड का उपयोग करके फ़ंक्शन को कॉल करें मैंने xcode में एक थ्रेड बनाया है और मैंने उस थ्रेड से फ़ंक्शन नाम दिया है।xcode

NSThread* myThread; 
[myThread start]; 
[self performSelector:@selector(func1:) onThread:myThread withObject:nil waitUntilDone:false] 

और बाद में मैं इस एक भी करने की कोशिश की: लेकिन मेरी समस्या यह है कि समारोह का नाम है जिसमें कॉल करने के लिए नहीं कहा जा रहा है दिया जाता है

कोड (जब कि समारोह में एक ब्रेकपाइंट डाल में पता चला है) :

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

func1 से ऊपर फ़ंक्शन का नाम है।

तो कर सकते हैं किसी भी एक कृपया मुझे बताओ कैसे धागा बना सकते हैं और वहाँ से func1 कॉल करने के लिए ....

उत्तर

16

आपके पहले कोड नमूने में ऐसा लगता है कि आप वास्तव में एक नया धागा बना रहे हैं। आप myThread वैरिएबल बनाते हैं और फिर start पर कॉल करते हैं, लेकिन इसके परिणामस्वरूप startnil पर भेजा जा सकता है। खाली धागा चर को performSelector:onThread:withObject:waitUntilDone: विधि पर भेजा जाता है जो संभावित रूप से कुछ भी नहीं करेगा।

performSelector:onThread:withObject:waitUntilDone: का उपयोग करके आप वास्तव में कुछ चलाने से पहले आपको एक धागा ठीक से बनाने की आवश्यकता होगी।

वैकल्पिक रूप से, यह मानना ​​बहुत आसान होगा, यह मानते हुए कि आपको performSelectorInBackground:withObject: का उपयोग करने के लिए विधि पृष्ठभूमि पर चलने वाली पृष्ठभूमि थ्रेड परवाह नहीं है। उदाहरण के लिए:

[self performSelectorInBackground:@selector(func1:) withObject:nil]; 
+0

उत्तर के लिए धन्यवाद, लेकिन कुछ बार यह मुख्य धागा लेता है, जो मैं नहीं चाहता ..... –

+0

मुझे आपके द्वारा किए गए किसी भी जानकारी को जानने में दिलचस्पी होगी 'निष्पादक इनबैकग्राउंड: withObject:' मुख्य थ्रेड का उपयोग करना । ऐप्पल प्रलेखन कहता है "यह विधि आपके आवेदन में एक नया धागा बनाता है, जो आपके आवेदन को बहुप्रचारित मोड में डालती है यदि यह पहले से नहीं थी।" यदि आपके पास ऐसी जानकारी है जो दिखाती है कि कभी-कभी यह मुख्य धागे का उपयोग करता है तो मुझे इसे देखने में दिलचस्पी होगी। – mttrb

+0

क्षमा करें कि मुख्य थ्रेड पर कार्रवाई नहीं हो रही थी, क्योंकि func1 के बाद ':' है, यह नहीं चल रहा था और मैंने सोचा कि यह मुख्य धागा ले रहा है। लेकिन अब जब मैंने ':' हटा दिया है (दूसरे जवाब के अनुसार इस सवाल के लिए) यह ठीक काम कर रहा है .. उत्तर के लिए धन्यवाद ...... –

3

अगर यह काम करता है निम्नलिखित का प्रयास करें:

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

जब से तुम किसी भी वस्तु से गुजर रहा नहीं कर रहे हैं आपके "func1" (उर्फ: आपकी विधि में पैरामीटर नहीं हैं) आपको इसके नाम के बाद ":" डालने की आवश्यकता नहीं है।

0

यदि आपका func1 एक तर्क स्वीकार कर रहा है। फिर निश्चित रूप से इसे आपके द्वारा उपयोग किए जाने वाले दूसरे दृष्टिकोण के साथ काम करना होगा। हो सकता है कि आपका fuc1 कोई औपचारिक तर्क न हो और फिर भी आप इस @ चयनकर्ता (fuc1 :) और ऑब्जेक्ट को शून्य के रूप में पास करने वाले चयनकर्ता में बुला रहे हों। इसलिए इस कारण से यह काम नहीं कर रहा है। यह एक कारण हो सकता है। अगर नहीं तो बस कोशिश करें।

+0

जब भी आप किसी भी वर्ग के किसी ऑब्जेक्ट का उपयोग कर रहे हों, तो स्मृति को आवंटित करना न भूलें, जैसा कि आपने अपने पहले दृष्टिकोण में किया था। – iDevAmit