如何在IOS中取消/退出/停止在后台运行的Thread对象或线程的执行

时间:2013-03-14 15:51:12

标签: iphone objective-c ios5 ios6

我分离下面给出的线程在后台进行一些操作

 currentThread = [[NSThread   alloc]initWithTarget:contactServiceselector:@selector(requestForContactBackup:)object:msisdn];

 [currentThread start];

此currentThread是AppDelegate的指针。 我的视图中有一个按钮,当我按下它时,我想取消或停止执行后台线程。

要做这样的事情:

-(void)cancelTheRunningTasks {

   if(self.currentThread !=nil) {

        [currentThread cancel];
        NSLog(@"IsCancelled: %d",[currentThread isCancelled]);   //here Yes returns
        [self removeNetworkIndicatorInView:backUpViewController.view];
    }  
}

后台线程仍处于执行状态的问题。

用我的线程参考如何从主线程中取消/停止执行/终止后台线程?

请参考一些解决方案。 感谢。

3 个答案:

答案 0 :(得分:3)

取消
更改接收器的取消状态以指示它应该退出。

退出
终止当前线程。

检查NSThread Class Reference

有关取消和操作对象的更多信息,请参阅NSOperation Class Reference

注意:在OS X v10.6中,取消方法的行为取决于操作当前是否在操作队列中。对于未排队的操作,此方法将操作标记为立即完成,生成相应的KVO通知。对于排队操作,它只是将操作标记为准备执行,并让队列调用其start方法,该方法随后退出并导致从队列中清除操作。

答案 1 :(得分:3)

您的后台线程需要通过isCancelled方法检查它是否已被取消...

if ([[NSThread currentThread] isCancelled]) {
    // do cleanup here
    [NSThread exit];
}

你无法从外部杀死线程,因为无法知道线程可能处于什么状态,因此,杀死它会产生不确定的行为(想象一下如果线程在分配器中持有互斥锁时被杀了...... ouch)。

答案 2 :(得分:2)

我解决了这个问题。正是我想做的事情,我想停止或从我的主线程或其他线程中杀死一些后台线程的工作条件。当我阅读Apple文档和一些帖子时,我得出结论,我们不能从其他线程中杀死一个线程,因为它们所有线程共享公共内存空间和资源,并且它不是更好地通过其他线程杀死线程(但是一个进程可以杀死另一个进程因为两个进程之间没有共同的内存空间共享)。 然后我得到的信息我们不能退出/杀死这样的线程,但我们仍然可以从其他线程设置正在运行的线程的取消属性。 (在用户请求取消任务的代码中)。

所以在这里我们可以设置取消属性。在我们正在执行的后台任务代码中,只检查是否设置了取消属性。 (我们需要在执行一大堆代码后进行监控)。如果设置了取消属性/是,则在该后台线程代码中调用[线程退出]并释放该线程分配的所有内存以保护内存泄漏(自动释放池不会在此处释放资源)。

这就是我如何解决问题。

简单 - >只需设置要取消的特定任务的属性作为取消设置。 (设置取消的方法将由线程对象引用调用)。

 if(self.currentThread != nil && [currentThread isExecuting])
   {
      [currentThread cancel];
   }

然后在代码中监视取消属性。如果属性设置然后退出线程。

if([appDelegate.currentThread isCancelled])
 {
      [NSThread exit];
 }

如果某人有更好的解决方案,请参阅。否则它也会正常工作。