2010-07-07 47 views
7

我创建在主线程使用NSThread子线程如何在iphone停止NSThread子线程

NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(MyThread:) object:timer];

5秒后,我使用的newThread取消]在主线程停止子-thread,但它没有工作,

方法MyThread的:在newThread仍在工作

所以,什么正确答案停止newThread,THX

实际上[newThread isCancelled]是肯定的,但选择MyThread的仍然沃金

+1

定时器的NSTimer实例 – None 2010-07-07 01:45:09

回答

10

cancel方法只通知线程,它被取消(正如你所提到的变化isCancelledYES。这是线程本身的责任来检查并退出。例如,在你的MyThread:方法,你可以这样做:

// At some checkpoint 
if([[NSThread currentThread] isCancelled]) { 
    /* do some clean up here */ 
    [NSThread exit]; 
} 

你应该这样做定期检查,并退出如图所示内螺纹;否则cancel不起任何作用。

+0

你的意思是一个线程只能通过自身被取消,没有被另一个线程或主线程? – None 2010-07-07 02:24:16

+1

@无:这意味着“取消”一个线程不会做你的想法。当你取消一个线程时,它会导致isCancelled返回YES。该线程应该停止执行。它不会强制线程立即停止执行,但如果它打开任何资源,那将会很麻烦。 – Chuck 2010-07-07 02:48:16

+0

@Chuck:谢谢, 但是如果我想在主线程中停止一个子线程,我该怎么办? – None 2010-07-07 03:11:21

1

- (无效)取消

讨论 这种方法的语义是相同的那些用于的NSOperation对象。该方法在接收器中设置状态信息,然后由isCancelled方法反映出来。 支持取消的线程应定期调用isCancelled方法来确定线程是否已被取消,如果已经取消则退出。

更多信息,请参阅NSThread API Reference