2009-03-13 15 views
6

से द्वितीयक थ्रेड को समाप्त करने के लिए मैं कोको फ्रेमवर्क की मदद से उद्देश्य-सी में लिखे गए एक छोटे से ऐप पर काम कर रहा हूं और मुझे एक बहुभाषी समस्या है। यदि मैं मुख्य धागे से माध्यमिक (कार्यकर्ता) धागे को समाप्त करने के बारे में कुछ मार्गदर्शन के साथ मेरी सहायता कर सकता हूं तो मैं वास्तव में इसकी सराहना करता हूं?मुख्य थ्रेड (कोको)

- (IBAction)startWorking:(id)sender { 
    [NSThread detachNewThreadSelector:@selector(threadMain:) toTarget:self withObject:nil]; 
} 

- (void)threadMain 
{ 
    // do a lot of boring, time consuming I/O here.. 
} 

- (IBAction)stop:(id)sender { 
    // what now? 
} 

मैं apple's docs पर ऐसा कुछ मिला है लेकिन क्या इस उदाहरण से याद आ रही है हिस्सा है जहां runloop इनपुट स्रोत बदल जाता exitNow मूल्य है।

इसके अलावा, मैं अपने ऐप में कई धागे का उपयोग नहीं करूँगा, इसलिए मैं एक अधिक जटिल विकल्प के बजाय एक सरल समाधान (कम ओवरहेड के साथ) पसंद करूंगा जो आसानी से कई थ्रेड प्रबंधित करने में सक्षम है, लेकिन अधिक ओवरहेड उत्पन्न होता है (जैसे। अग्रिम

उत्तर

12

में runloops के बजाय)

धन्यवाद शायद ताले का उपयोग कर (?) मुझे लगता है कि सबसे आसान तरीका है NSThread के -(void)cancel method उपयोग करने के लिए है। आपको अपने द्वारा बनाए गए धागे के संदर्भ की भी आवश्यकता होगी। आपका उदाहरण कोड कुछ इस तरह दिखेगा, यदि आप एक पाश के रूप में कार्यकर्ता धागा कर सकते हैं:

- (IBAction)startWorking:(id)sender { 
    myThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadMain:) object:nil]; 
    [myThread start]; 
} 

- (void)threadMain 
{ 
    while(1) 
    { 
     // do IO here 
     if([[NSThread currentThread] isCancelled]) 
      break; 
    } 
} 

- (IBAction)stop:(id)sender { 
    [myThread cancel]; 
    [myThread release]; 
    myThread = nil; 
} 
बेशक

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

+0

यह बहुत अच्छा काम करता है! धन्यवाद! मेरे पास धागे में एक लूप है, इसलिए आपका समाधान बिना किसी अतिरिक्त कोड ब्रेकिंग के दस्ताने की तरह फिट बैठता है :) – andi

+0

आप थ्रेड के इरादे को बना सकते हैं जबकि लूप स्पष्ट होकर (! [[NSThread currentThread] को रद्द कर दिया गया है) जबकि (1) और लूप कोड में गहरी जांच की गई है। –

+0

@ बररी वार अच्छा बिंदु। मुझे लगता है कि मैं उस लूप में एक और शर्त (उदाहरण के लिए किया गया) होने की उम्मीद कर रहा था। –

2

एनएसओपरेशन और एनएसओपरेशनक्यूयू कक्षाओं पर भी नज़र डालें। यह थ्रेडिंग वर्गों का एक और सेट है जो एक कार्यकर्ता धागा मॉडल को विकसित करना बहुत आसान बनाता है।

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